diff --git a/Admin/Install/Media.install.json b/Admin/Install/Media.install.json index 43634f7..8c20974 100755 --- a/Admin/Install/Media.install.json +++ b/Admin/Install/Media.install.json @@ -11,7 +11,7 @@ "create_collection": true, "name": "Default", "virtualPath": "/Modules/Auditor", - "path": "/Modules/Media/Files/Modules/Auditor", + "path": "/Modules/Auditor", "files": [ "/Modules/Auditor/Admin/Install/Media/defaultReport.pdf.php" ], diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 02bd76d..177da23 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -61,7 +61,17 @@ final class ApiController extends Controller ) : void { $newString = StringUtils::stringify($new, \JSON_PRETTY_PRINT); - $audit = new Audit(new NullAccount($account), null, $newString, $type, $trigger, $module, $ref, $content, (int) \ip2long($ip ?? '127.0.0.1')); + $audit = new Audit( + new NullAccount($account), + null, + $newString, + $type, + $trigger, + $module, + $ref, + $content, + (int) \ip2long($ip ?? '127.0.0.1') + ); AuditMapper::create()->execute($audit); } @@ -104,7 +114,17 @@ final class ApiController extends Controller return; } - $audit = new Audit(new NullAccount($account), $oldString, $newString, $type, $trigger, $module, $ref, $content, (int) \ip2long($ip ?? '127.0.0.1')); + $audit = new Audit( + new NullAccount($account), + $oldString, + $newString, + $type, + $trigger, + $module, + $ref, + $content, + (int) \ip2long($ip ?? '127.0.0.1') + ); AuditMapper::create()->execute($audit); } @@ -141,7 +161,17 @@ final class ApiController extends Controller ) : void { $oldString = StringUtils::stringify($old, \JSON_PRETTY_PRINT); - $audit = new Audit(new NullAccount($account), $oldString, null, $type, $trigger, $module, $ref, $content, (int) \ip2long($ip ?? '127.0.0.1')); + $audit = new Audit( + new NullAccount($account), + $oldString, + null, + $type, + $trigger, + $module, + $ref, + $content, + (int) \ip2long($ip ?? '127.0.0.1') + ); AuditMapper::create()->execute($audit); } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index 25c3aa0..4e6b28b 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -14,9 +14,11 @@ declare(strict_types=1); namespace Modules\Auditor\Controller; +use View\TableView; +use Modules\Admin\Models\SettingsEnum; use Modules\Auditor\Models\AuditMapper; +use Modules\Media\Models\MediaMapper; use phpOMS\Contract\RenderableInterface; -use phpOMS\DataStorage\Database\Query\OrderType; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Views\View; @@ -50,22 +52,54 @@ final class BackendController extends Controller $view->setTemplate('/Modules/Auditor/Theme/Backend/audit-list'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1006201001, $request, $response)); - if ($request->getData('ptype') === 'p') { - $data = AuditMapper::getAll()->with('createdBy')->sort('id', OrderType::ASC)->where('id', (int) ($request->getData('id') ?? 0), '>')->limit(25)->execute(); + $pageLimit = 25; + $view->addData('pageLimit', $pageLimit); - if (empty($data)) { - $data = AuditMapper::getAll()->with('createdBy')->sort('id', OrderType::DESC)->where('id', 0, '>')->limit(25)->execute(); - } else { - $data = \array_reverse($data); - } + $mapper = AuditMapper::getAll()->with('createdBy'); + $list = AuditMapper::getAuditList( + $mapper, + (int) ($request->getData('id') ?? 0), + $request->getData('pType'), + 25 + ); - $view->setData('audits', $data); - } elseif ($request->getData('ptype') === 'n') { - $view->setData('audits', AuditMapper::getAll()->with('createdBy')->sort('id', OrderType::DESC)->where('id', (int) ($request->getData('id') ?? 0), '<')->limit(25)->execute()); - } else { - $view->setData('audits', AuditMapper::getAll()->with('createdBy')->sort('id', OrderType::DESC)->where('id', 0, '>')->limit(25)->execute()); + $view->setData('hasPrevious', $list['hasPrevious']); + $view->setData('hasNext', $list['hasNext']); + $view->setData('audits', $list['data']); + + /** @var \Model\Setting[] $exportTemplates */ + $exportTemplates = $this->app->appSettings->get( + names: [ + SettingsEnum::DEFAULT_PDF_EXPORT_TEMPLATE, + SettingsEnum::DEFAULT_EXCEL_EXPORT_TEMPLATE, + SettingsEnum::DEFAULT_CSV_EXPORT_TEMPLATE, + SettingsEnum::DEFAULT_WORD_EXPORT_TEMPLATE, + SettingsEnum::DEFAULT_EMAIL_EXPORT_TEMPLATE, + ], + module: 'Admin' + ); + + $templateIds = []; + foreach ($exportTemplates as $template) { + $templateIds[] = (int) $template->content; } + $mediaTemplates = MediaMapper::getAll() + ->where('id', $templateIds, 'in') + ->execute(); + + $tableView = new TableView($this->app->l11nManager, $request, $response); + $tableView->module = 'Auditor'; + $tableView->theme = 'Backend'; + $tableView->setExportTemplate('/Web/Backend/Themes/popup-export-data'); + $tableView->setExportTemplates($mediaTemplates); + $tableView->setColumnHeaderElementTemplate('/Web/Backend/Themes/header-element-table'); + $tableView->setFilterTemplate('/Web/Backend/Themes/popup-filter-table'); + $tableView->setSortTemplate('/Web/Backend/Themes/sort-table'); + $tableView->exportUri = '{/api}auditor/list/export'; + + $view->addData('tableView', $tableView); + return $view; } diff --git a/Models/AuditMapper.php b/Models/AuditMapper.php index 9681ac9..cacaba2 100755 --- a/Models/AuditMapper.php +++ b/Models/AuditMapper.php @@ -16,6 +16,7 @@ namespace Modules\Auditor\Models; use Modules\Admin\Models\AccountMapper; use phpOMS\DataStorage\Database\Mapper\DataMapperFactory; +use phpOMS\DataStorage\Database\Query\OrderType; /** * Mapper class. @@ -91,4 +92,86 @@ final class AuditMapper extends DataMapperFactory * @since 1.0.0 */ public const CREATED_AT = 'auditor_audit_created_at'; + + public static function getAuditList(mixed $mapper, int $id, string $type = null, int $pageLimit) : array + { + /** @var \Modules\Auditor\Models\Audit[] $data */ + $data = []; + + $hasPrevious = false; + $hasNext = false; + + if ($type === 'p') { + $cloned = clone $mapper; + $data = $mapper->sort('id', OrderType::ASC) + ->where('id', $id, '>=') + ->limit($pageLimit + 2) + ->execute(); + + if (($count = \count($data)) < 2) { + $data = $cloned->sort('id', OrderType::DESC) + ->where('id', 0, '>') + ->limit($pageLimit + 1) + ->execute(); + + $hasNext = $count > $pageLimit; + if ($hasNext) { + \array_pop($data); + --$count; + } + } else { + if (\reset($data)->getId() === $id) { + \array_shift($data); + $hasNext = true; + --$count; + } + + if ($count > $pageLimit) { + \array_pop($data); + $hasNext = true; + --$count; + + if ($count > $pageLimit) { + $hasPrevious = true; + \array_pop($data); + } + } + + $data = \array_reverse($data); + } + } elseif ($type === 'n') { + $data = $mapper->sort('id', OrderType::DESC) + ->where('id', $id, '<=') + ->limit($pageLimit + 2) + ->execute(); + + if (!empty($data)) { + if (\reset($data)->getId() === $id) { + \array_shift($data); + $hasPrevious = true; + } + + if (\count($data) > $pageLimit) { + \array_pop($data); + $hasNext = true; + } + } + } else { + $data = $mapper->sort('id', OrderType::DESC) + ->where('id', 0, '>') + ->limit($pageLimit + 1) + ->execute(); + + $hasNext = ($count = \count($data)) > $pageLimit; + if ($hasNext) { + \array_pop($data); + } + } + + return [ + 'hasPrevious' => $hasPrevious, + 'hasNext' => $hasNext, + 'data' => $data + ]; + } } diff --git a/Theme/Backend/audit-list.tpl.php b/Theme/Backend/audit-list.tpl.php index 9a7ad09..e598626 100755 --- a/Theme/Backend/audit-list.tpl.php +++ b/Theme/Backend/audit-list.tpl.php @@ -20,8 +20,19 @@ use phpOMS\Uri\UriFactory; */ $audits = $this->getData('audits') ?? []; -$previous = empty($audits) ? '{/prefix}admin/audit/list' : '{/prefix}admin/audit/list?{?}&id=' . \reset($audits)->getId() . '&ptype=p'; -$next = empty($audits) ? '{/prefix}admin/audit/list' : '{/prefix}admin/audit/list?{?}&id=' . \end($audits)->getId() . '&ptype=n'; +$previous = empty($audits) || !$this->getData('hasPrevious') + ? '{/prefix}admin/audit/list' + : '{/prefix}admin/audit/list?{?}&id=' + . \reset($audits)->getId() + . '&ptype=p'; +$next = empty($audits) + ? '{/prefix}admin/audit/list' + : '{/prefix}admin/audit/list?{?}&id=' + . ($this->getData('hasNext') ? \end($audits)->getId() : $this->request->getData('id')) + . '&ptype=n'; + +$tableView = $this->getData('tableView'); +$tableView->id = 'auditList'; echo $this->getData('nav')->render(); ?> @@ -34,108 +45,49 @@ echo $this->getData('nav')->render(); ?> = $this->getHtml('Audits'); ?> - - + = $tableView->renderExport(); ?> +