first commit

This commit is contained in:
2026-02-08 21:16:11 +01:00
commit e17b7026fd
8881 changed files with 1160453 additions and 0 deletions

View File

@@ -0,0 +1,241 @@
<?php
/**
* @package akeebabackup
* @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU General Public License version 3, or later
*/
// Protect from unauthorized access
defined('_JEXEC') || die();
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
/** @var \Akeeba\Component\AkeebaBackup\Administrator\View\Manage\HtmlView $this */
HTMLHelper::_('formbehavior.chosen');
HTMLHelper::_('bootstrap.popover', '.akeebaCommentPopover', [
'trigger' => 'click hover focus'
]);
HTMLHelper::_('bootstrap.tooltip', '.akeebaTooltip');
if ($this->promptForBackupRestoration)
{
echo $this->loadAnyTemplate('howtorestore_modal');
}
?>
<div id="akeebabackup-manage-iframe-modal"
class="modal fade"
tabindex="-1"
role="dialog"
aria-labelledby="akeebabackup-manage-iframe-modal-title"
aria-hidden="true"
>
<div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title" id="akeebabackup-manage-iframe-modal-title">
</h3>
<button type="button" class="btn-close novalidate"
id="akeebabackup-manage-iframe-modal-close"
data-bs-dismiss="modal"
aria-label="<?= Text::_('JLIB_HTML_BEHAVIOR_CLOSE') ?>"></button>
</div>
<div class="modal-body p-3" id="akeebabackup-manage-iframe-modal-content"></div>
</div>
</div>
</div>
<div class="alert alert-info">
<h3><?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_HOWDOIRESTORE_LEGEND') ?></h3>
<p>
<?= Text::sprintf('COM_AKEEBABACKUP_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_' . (AKEEBABACKUP_PRO ? 'PRO' : 'CORE'), 'http://akee.ba/abrestoreanywhere', 'index.php?option=com_akeebabackup&view=Transfer', 'https://www.akeeba.com/latest-kickstart-core.zip') ?>
</p>
<?php if (!AKEEBABACKUP_PRO): ?>
<p>
<?= Text::sprintf('COM_AKEEBABACKUP_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_CORE_INFO_ABOUT_PRO', 'https://www.akeeba.com/products/akeeba-backup.html') ?>
</p>
<?php endif ?>
</div>
<form action="<?= Route::_('index.php?option=com_akeebabackup&view=Manage'); ?>"
method="post" name="adminForm" id="adminForm">
<div class="row">
<div class="col-md-12">
<div id="j-main-container" class="j-main-container">
<?= LayoutHelper::render('joomla.searchtools.default', ['view' => $this]) ?>
<?php if (empty($this->items)) : ?>
<div class="alert alert-info">
<span class="icon-info-circle" aria-hidden="true"></span><span
class="visually-hidden"><?= Text::_('INFO'); ?></span>
<?= Text::_('JGLOBAL_NO_MATCHING_RESULTS'); ?>
</div>
<?php else : ?>
<table class="table" id="articleList">
<caption class="visually-hidden">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_TABLE_CAPTION'); ?>, <span
id="orderedBy"><?= Text::_('JGLOBAL_SORTED_BY'); ?> </span>, <span
id="filteredBy"><?= Text::_('JGLOBAL_FILTERED_BY'); ?></span>
</caption>
<thead>
<tr>
<td class="w-1 text-center">
<?= HTMLHelper::_('grid.checkall'); ?>
</td>
<th scope="col" class="text-center d-none d-md-table-cell" style="max-width: 48px;">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_ID') ?>
</th>
<th scope="col" class="text-center" style="max-width: 40px">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_FROZEN') ?>
</th>
<th scope="col" class="text-center">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_DESCRIPTION') ?>
</th>
<th scope="col" class="text-center d-none d-md-table-cell">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_PROFILEID') ?>
</th>
<th scope="col" class="text-center" style="max-width: 40px;">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_STATUS') ?>
</th>
<th scope="col" class="text-center d-none d-sm-table-cell">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_MANAGEANDDL') ?>
</th>
</tr>
</thead>
<tbody>
<?php foreach ($this->items as $i => $record) : ?>
<?php
[$originDescription, $originIcon] = $this->getOriginInformation($record);
[$startTime, $duration, $timeZoneText] = $this->getTimeInformation($record);
[$statusClass, $statusIcon] = $this->getStatusInformation($record);
$profileName = $this->getProfileName($record);
$comment = $this->escapeComment($record['comment']);
$frozenIcon = 'akion-waterdrop';
$frozenTask = 'freeze';
$frozenTitle = \JText::_('COM_AKEEBABACKUP_BUADMIN_LABEL_ACTION_FREEZE');
if ($record['frozen'])
{
$frozenIcon = 'akion-ios-snowy';
$frozenTask = 'unfreeze';
$frozenTitle = \JText::_('COM_AKEEBABACKUP_BUADMIN_LABEL_ACTION_UNFREEZE');
}
?>
<tr class="row<?= $i % 2; ?>">
<?php // Checkbox ?>
<td class="text-center">
<?= HTMLHelper::_('grid.id', $i, $record['id'], false, 'cid', 'cb', $record['id']); ?>
</td>
<?php // Backup ID ?>
<td class="d-none d-md-table-cell">
<?= $record['id'] ?>
</td>
<?php // Frozen ?>
<td>
<?php // $frozenIcon ?>
<?= HTMLHelper::_('jgrid.state', $this->getFrozenStates(), $record['frozen'], $i, array('prefix' => 'Manage.', 'translate' => true), true, true, 'cb'); ?>
</td>
<?php // Description, backup date, duration and size ?>
<td>
<span class="<?= $originIcon ?> akeebaCommentPopover" rel="popover"
title="<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_ORIGIN') ?>"
data-bs-content="<?= $originDescription ?>"></span>
<?php if (!(empty($comment))): ?>
<span class="fa fa-info-circle akeebaCommentPopover" rel="popover"
title="<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_COMMENT') ?>"
data-bs-content="<?= $comment ?>"></span>
<?php endif ?>
<a href="<?= Uri::base() ?>index.php?option=com_akeebabackup&view=statistic&layout=edit&id=<?= $record['id'] ?>">
<?= empty($record['description'])
? Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_NODESCRIPTION')
: $this->escape($record['description']) ?>
</a>
<div class="row">
<span class="col-lg akeeba-buadmin-startdate">
<span class="fa fa-calendar akeebaTooltip"
title="<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_START') ?>"
></span>&nbsp;
<?= $startTime ?> <?= $timeZoneText ?>
</span>
<span class="col-lg akeeba-buadmin-duration">
<span class="fa fa-stopwatch akeebaTooltip"
title="<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_DURATION') ?>"
></span>&nbsp;
<?= $duration ?: '&mdash;' ?>
</span>
<span class="col-lg akeeba-buadmin-size">
<span class="fa fa-weight-hanging akeebaTooltip"
title="<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_SIZE') ?>"
></span>&nbsp;
<?php if ($record['meta'] == 'ok'): ?>
<?= $this->formatFilesize($record['size']) ?>
<?php elseif ($record['total_size'] > 0): ?>
<i><?= $this->formatFilesize($record['total_size']) ?></i>
<?php else: ?>
&mdash;
<?php endif ?>
</span>
</div>
<div class="row d-block d-md-none">
<div class="col-md">
<span class="fa fa-users"></span>&nbsp;
#<?= (int) $record['profile_id'] ?>.
<?= $profileName == '&mdash;' ? $profileName : $this->escape($profileName) ?>
</div>
<div class="col-md">
<span class="fa fa-align-justify"></span>&nbsp;
<span class="fs-6 fst-italic">
<?= $this->translateBackupType($record['type']) ?>
</span>
</div>
</div>
</td>
<?php // Backup profile ?>
<td class="d-none d-md-table-cell">
<div>
#<?= (int) $record['profile_id'] ?>.
<?= $profileName == '&mdash;' ? $profileName : $this->escape($profileName) ?>
</div>
<div>
<span class="fs-6 fst-italic">
<?= $this->translateBackupType($record['type']) ?>
</span>
</div>
</td>
<?php // Status ?>
<td>
<span class="badge fs-3 rounded-pill w-100 <?= $statusClass ?> akeebaTooltip"
rel="popover"
title="<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_STATUS_' . $record['meta']) ?>"
>
&nbsp;<span class="<?= $statusIcon ?>"></span>&nbsp;
</span>
</td>
<?php // Manage & Download ?>
<td class="d-none d-sm-table-cell">
<?= $this->loadAnyTemplate('manage_column', false, ['record' => &$record]); ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php // Load the pagination. ?>
<?= $this->pagination->getListFooter(); ?>
<?php endif; ?>
<input type="hidden" name="task" value=""> <input type="hidden" name="boxchecked" value="0">
<?= HTMLHelper::_('form.token'); ?>
</div>
</div>
</div>
</form>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!--~
~ @package akeebabackup
~ @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
~ @license GNU General Public License version 3, or later
-->
<metadata>
<layout title="COM_AKEEBABACKUP_VIEW_MANAGE_TITLE">
<message>
<![CDATA[COM_AKEEBABACKUP_VIEW_MANAGE_DESC]]>
</message>
</layout>
</metadata>

View File

@@ -0,0 +1,66 @@
<?php
/**
* @package akeebabackup
* @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU General Public License version 3, or later
*/
// Protect from unauthorized access
use Joomla\CMS\Language\Text;
defined('_JEXEC') || die();
/** @var \Akeeba\Component\AkeebaBackup\Administrator\View\Manage\HtmlView $this */
// Make sure we only ever add this HTML and JS once per page
if (defined('AKEEBA_VIEW_JAVASCRIPT_HOWTORESTORE'))
{
return;
}
define('AKEEBA_VIEW_JAVASCRIPT_HOWTORESTORE', 1);
$this->document->addScriptOptions('akeebabackup.Manage.ShowHowToRestoreModal', 1);
?>
<div id="akeebabackup-config-howtorestore-bubble"
class="modal fade"
tabindex="-1"
role="dialog"
aria-labelledby="akeeba-config-confwiz-title"
aria-hidden="true"
>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title" id="akeeba-config-confwiz-title">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_HOWDOIRESTORE_LEGEND') ?>
</h3>
<button type="button" class="btn-close novalidate" data-bs-dismiss="modal"
aria-label="<?= Text::_('JLIB_HTML_BEHAVIOR_CLOSE') ?>"></button>
</div>
<div class="modal-body p-3">
<p>
<?= Text::sprintf('COM_AKEEBABACKUP_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_' . (AKEEBABACKUP_PRO ? 'PRO' : 'CORE'), 'http://akee.ba/abrestoreanywhere', 'index.php?option=com_akeebabackup&view=Transfer', 'https://www.akeeba.com/latest-kickstart-core.zip') ?>
</p>
<p>
<?php if (!AKEEBABACKUP_PRO): ?>
<?= Text::sprintf('COM_AKEEBABACKUP_BUADMIN_LABEL_HOWDOIRESTORE_TEXT_CORE_INFO_ABOUT_PRO', 'https://www.akeeba.com/products/akeeba-backup.html') ?>
<?php endif; ?>
</p>
</div>
<div class="modal-footer">
<button type="button"
class="btn btn-primary novalidate" data-bs-dismiss="modal">
<span class="fa fa-times"></span>
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_BTN_REMINDME') ?>
</button>
<a href="index.php?option=com_akeebabackup&view=Manage&task=hidemodal" class="btn btn-success">
<span class="fa fa-check-circle"></span>
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_BTN_DONTSHOWTHISAGAIN') ?>
</a>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,230 @@
<?php
/**
* @package akeebabackup
* @copyright Copyright (c)2006-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU General Public License version 3, or later
*/
// Protect from unauthorized access
defined('_JEXEC') || die();
use Akeeba\Component\AkeebaBackup\Administrator\Helper\Utils;
use Akeeba\Engine\Factory;
use Joomla\CMS\Language\Text;
/** @var \Akeeba\Component\AkeebaBackup\Administrator\View\Manage\HtmlView $this */
/** @var array $record */
if (!isset($record['remote_filename']))
{
$record['remote_filename'] = '';
}
$archiveExists = $record['meta'] == 'ok';
$showManageRemote = $record['hasRemoteFiles'] && (AKEEBABACKUP_PRO == 1);
$engineForProfile = array_key_exists($record['profile_id'], $this->enginesPerProfile) ? $this->enginesPerProfile[$record['profile_id']] : 'none';
$showUploadRemote = $this->permissions['backup'] && $archiveExists && !$showManageRemote && ($engineForProfile != 'none') && ($record['meta'] != 'obsolete') && (AKEEBABACKUP_PRO == 1);
$showDownload = $this->permissions['download'] && $archiveExists;
$showViewLog = $this->permissions['backup'] && isset($record['backupid']) && !empty($record['backupid']);
$postProcEngine = '';
$thisPart = '';
$thisID = urlencode($record['id']);
if ($showUploadRemote)
{
$postProcEngine = $engineForProfile ?: 'none';
$showUploadRemote = !empty($postProcEngine);
}
$relativePath = Utils::getRelativePath(JPATH_SITE, dirname($record['absolute_path']));
if (substr($relativePath, 0, 2) === './')
{
$relativePath = substr($relativePath, 2);
}
?>
<div class="modal fade"
id="akeeba-buadmin-<?= (int)$record['id'] ?>"
tabindex="-1"
role="dialog"
aria-labelledby="akeeba-buadmin-<?= (int)$record['id'] ?>-title"
aria-hidden="true"
>
<div class="modal-dialog modal-xl modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title" id="akeeba-buadmin-<?= (int)$record['id'] ?>-title">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LBL_BACKUPINFO') ?>
</h3>
<button type="button" class="btn-close novalidate" data-bs-dismiss="modal"
aria-label="<?= Text::_('JLIB_HTML_BEHAVIOR_CLOSE') ?>"></button>
</div>
<div class="modal-body p-3">
<div class="row mb-3">
<div class="col-md-5 fw-bold">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LBL_ARCHIVEEXISTS') ?>
</div>
<div class="col-md-7 fw-bold">
<?php if($record['meta'] == 'ok'): ?>
<span class="text-success">
<?= Text::_('JYES') ?>
</span>
<?php else : ?>
<span class="text-danger">
<?= Text::_('JNO') ?>
</span>
<?php endif ?>
</div>
</div>
<div class="row mb-3">
<div class="col-md-5 fw-bold">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LBL_ARCHIVEPATH' . ($archiveExists ? '' : '_PAST'))?>
</div>
<div class="col-md-7 text-break">
<?= $this->escape($relativePath) ?>
</div>
</div>
<div class="row mb-3">
<div class="col-md-5 fw-bold">
<p>
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LBL_ARCHIVENAME' . ($archiveExists ? '' : '_PAST'))?>
</p>
<p class="alert alert-info">
<span class="fa fa-info-circle"></span>
<?= Text::plural('COM_AKEEBABACKUP_BUADMIN_LBL_ARCHIVEPARTS', max($record['multipart'], 1)) ?>
</p>
</div>
<div class="col-md-7">
<?php if ($record['multipart'] < 2): ?>
<code>
<?= $this->escape($record['archivename']) ?>
</code>
<?php else: ?>
<ul>
<?php foreach(Factory::getStatistics()->get_all_filenames($record, false) as $file): ?>
<li>
<code><?= basename($file) ?></code>
</li>
<?php endforeach ?>
</ul>
<?php endif ?>
</div>
</div>
</div>
</div>
</div>
</div>
<?php if($showDownload): ?>
<div id="akeeba-buadmin-download-<?= (int)$record['id'] ?>"
class="modal fade"
tabindex="-1"
role="dialog"
aria-labelledby="akeeba-buadmin-download-<?= (int)$record['id'] ?>-title"
aria-hidden="true"
>
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title" id="akeeba-buadmin-download-<?= (int)$record['id'] ?>">
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LBL_DOWNLOAD_TITLE')?>
</h3>
<button type="button" class="btn-close novalidate" data-bs-dismiss="modal"
aria-label="<?= Text::_('JLIB_HTML_BEHAVIOR_CLOSE') ?>"></button>
</div>
<div class="modal-body p-3">
<div class="alert alert-warning">
<p>
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LBL_DOWNLOAD_WARNING')?>
</p>
</div>
<?php if($record['multipart'] < 2): ?>
<button type="button"
class="btn btn-primary btn-sm comAkeebaManageDownloadButton"
data-id="<?= (int) $record['id'] ?>">
<span class="fa fa-file-download"></span>
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LOG_DOWNLOAD') ?>
</button>
<?php else: ?>
<div>
<?= Text::plural('COM_AKEEBABACKUP_BUADMIN_LBL_DOWNLOAD_PARTS', (int)$record['multipart']) ?>
</div>
<div class="d-flex flex-row flex-wrap justify-content-start align-items-start">
<?php for($count = 0; $count < $record['multipart']; $count++): ?>
<button type="button"
class="btn btn-secondary btn-sm text-decoration-none me-2 mb-2 comAkeebaManageDownloadButton"
data-id="<?= (int) $record['id'] ?>"
data-part="<?= (int) $count ?>">
<span class="fa fa-file-download"></span>
<?= Text::sprintf('COM_AKEEBABACKUP_BUADMIN_LABEL_PART', $count) ?>
</button>
<?php endfor ?>
</div>
<?php endif ?>
</div>
</div>
</div>
</div>
<?php endif ?>
<?php if($showManageRemote || $showUploadRemote): ?>
<div class="mb-3">
<?php if($showManageRemote): ?>
<div style="padding-bottom: 3pt;">
<button type="button"
class="btn btn-primary akeeba_remote_management_link"
data-management="index.php?option=com_akeebabackup&view=Remotefiles&tmpl=component&task=listactions&id=<?= (int) $record['id'] ?>"
data-reload="index.php?option=com_akeebabackup&view=Manage"
>
<span class="fa fa-cloud"></span>
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LABEL_REMOTEFILEMGMT') ?>
</button>
</div>
<?php elseif($showUploadRemote): ?>
<button type="button"
class="btn btn-primary akeeba_upload"
data-upload="index.php?option=com_akeebabackup&view=Upload&tmpl=component&task=start&id=<?= (int) $record['id'] ?>"
data-reload="index.php?option=com_akeebabackup&view=Manage"
title="<?= Text::sprintf('COM_AKEEBABACKUP_TRANSFER_DESC', Text::_("ENGINE_POSTPROC_{$postProcEngine}_TITLE")) ?>">
<span class="fa fa-cloud-upload-alt"></span>
<?= Text::_('COM_AKEEBABACKUP_TRANSFER_TITLE') ?>
(<span class="fst-italic"><?= $this->escape($postProcEngine) ?></span>)
</button>
<?php endif ?>
</div>
<?php endif ?>
<div>
<?php if($showDownload): ?>
<button type="button"
class="btn btn-<?= ($showManageRemote || $showUploadRemote) ? 'secondary' : 'success' ?> me-2 mb-2"
data-bs-toggle="modal"
data-bs-target="#akeeba-buadmin-download-<?= (int)$record['id'] ?>"
>
<span class="fa fa-file-download"></span>
<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LOG_DOWNLOAD') ?>
</button>
<?php endif ?>
<?php if($showViewLog): ?>
<a class="btn btn-outline-dark btn-small text-decoration-none me-2 mb-2 akeebaCommentPopover"
<?= ($record['meta'] != 'obsolete') ? '' : 'disabled="disabled"' ?>
href="index.php?option=com_akeebabackup&view=Log&tag=<?= $this->escape($record['tag']) ?>.<?= $this->escape($record['backupid']) ?>&profileid=<?= (int)$record['profile_id'] ?>"
title="<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LBL_LOGFILEID') ?>"
data-bs-content="<?= $this->escape($record['backupid']) ?>">
<span class="fa fa-search"></span>
<?= Text::_('COM_AKEEBABACKUP_LOG') ?>
</a>
<?php endif ?>
<button type="button"
class="btn btn-info btn-sm akeebaTooltip"
data-bs-toggle="modal"
data-bs-target="#akeeba-buadmin-<?= (int) $record['id'] ?>"
title="<?= Text::_('COM_AKEEBABACKUP_BUADMIN_LBL_BACKUPINFO') ?>"
>
<span class="fa fa-info-circle"></span>
</button>
</div>