taktik-nette

This commit is contained in:
2025-01-22 22:52:26 +01:00
commit 8e2cd6ca68
45 changed files with 5410 additions and 0 deletions

View File

@@ -0,0 +1,137 @@
<?php
declare(strict_types=1);
namespace App\UI\Results;
use App\Repository\SurveyRepository;
use App\UI\DTO\FilterDTO;
use App\UI\DTO\OrderDTO;
use App\UI\Form\ResultFilteringFactory;
use Nette\Application\Attributes\Persistent;
use Nette\Application\UI\Form;
use Nette\Application\UI\Presenter;
use Nette\Http\Session;
use Nette\Utils\Paginator;
use Nubium\Exception\ThisShouldNeverHappenException;
class ResultsPresenter extends Presenter
{
#[Persistent]
public ?string $order = null;
#[Persistent]
public ?string $direction = null;
/**
* @var array<string, mixed>|null
*/
#[Persistent]
public ?array $filter = null;
protected const SESSION_STORE_KEY = 'survey_results_v1';
public function __construct(
protected readonly SurveyRepository $surveyRepository,
protected readonly ResultFilteringFactory $resultFilteringFactory,
protected readonly Session $session,
) {
parent::__construct();
$this->restoreStateFromSession();
if ($this->order === null) {
$this->order = 'survey_id';
}
if ($this->direction === null) {
$this->direction = 'desc';
}
if ($this->filter === null) {
$this->filter = null;
}
}
public function renderDefault(int $page = 1): void
{
$order = OrderDTO::createOrReturnNullFromData($this->order, $this->direction, ['survey_name', 'comments', 'survey_id']);
$filter = FilterDTO::createFromData($this->filter, ['name', 'comments', 'agreement', 'interest']);
$itemsCount = $this->surveyRepository->getSuveysCount($filter);
$paginator = new Paginator();
$paginator->setItemCount($itemsCount);
$paginator->setItemsPerPage(10);
$paginator->setPage($page);
$articles = $this->surveyRepository->findSurveys($paginator->getLength(), $paginator->getOffset(), $order, $filter);
$this->template->surveys = $articles; // @phpstan-ignore property.notFound
$this->template->paginator = $paginator; // @phpstan-ignore property.notFound
$this->template->order = $this->order; // @phpstan-ignore property.notFound
$this->template->direction = $this->direction; // @phpstan-ignore property.notFound
}
protected function createComponentFilteringForm(): Form
{
$form = $this->resultFilteringFactory->create();
$form->setDefaults($this->filter ?? []);
// @phpstan-ignore-next-line assign.propertyType
$form->onSuccess[] = function (\Nette\Forms\Form $form, array $values): void {
if ($form->isValid()) {
$filter = [];
if (!empty($values['name'])) {
$filter['name'] = $values['name'];
}
if (!empty($values['agreement'])) {
$filter['agreement'] = $values['agreement'];
}
if (!empty($values['comments'])) {
$filter['comments'] = $values['comments'];
}
if (!empty($values['interest'])) {
$filter['interest'] = $values['interest'];
}
$this->filter = $filter;
$this->storeStateIntoSession();
$this->redirect('default', [
'page' => 1,
'filter' => $filter,
]);
}
};
return $form;
}
protected function restoreStateFromSession(): void
{
$session = $this->session->getSection(self::SESSION_STORE_KEY);
if ($session->get('order') !== null) {
$this->order = $session->get('order');
}
if ($session->get('direction') !== null) {
$this->direction = $session->get('direction');
}
if ($session->get('filter') !== null) {
$this->filter = $session->get('filter');
}
}
protected function storeStateIntoSession(): void
{
$session = $this->session->getSection(self::SESSION_STORE_KEY);
$session->set('order', $this->order);
$session->set('direction', $this->direction);
$session->set('filter', $this->filter);
}
public function terminate(): void
{
$this->storeStateIntoSession();
parent::terminate();
}
}

View File

@@ -0,0 +1,63 @@
{block content}
<h1>Ankety</h1>
<div class="suveys">
{control filteringForm}
{if count($surveys) == 0}
<div class="alert alert-danger">{_('survey.data_not_found')}</div>
{else}
<table class="table">
<thead>
<tr>
<th>
<a n:href="default, 1, order => 'survey_id', direction => $direction === 'ASC' && $order === 'survey_id' ? 'DESC' : 'ASC'">
{_('survey.id')} {$order === 'survey_id' ? ($direction === 'ASC' ? '▲' : '▼') : ''}
</a>
</th>
<th>
<a n:href="default, 1, order => 'survey_name', direction => $direction === 'ASC' && $order === 'survey_name' ? 'DESC' : 'ASC'">
{_('survey.name')} {$order === 'survey_name' ? ($direction === 'ASC' ? '▲' : '▼') : ''}
</a>
</th>
<th>
<a n:href="default, 1, order => 'comments', direction => $direction === 'ASC' && $order === 'comments' ? 'DESC' : 'ASC'">
{_('survey.comments')} {$order === 'comments' ? ($direction === 'ASC' ? '▲' : '▼') : ''}
</a>
</th>
<th>{_('survey.interests')}</th>
</tr>
</thead>
<tbody>
{foreach $surveys as $survey}
<tr >
<td>{$survey->survey_id}</td>
<td>{$survey->survey_name}</td>
<td>{$survey->comments}</td>
<td>{interests($survey->interests)}</td>
</tr>
{/foreach}
</tbody>
</table>
{/if}
</div>
{if count($surveys) > 0}
<div class="pagination">
{if !$paginator->isFirst()}
<a n:href="default, 1">{_('pagination.first')}</a>
&nbsp;|&nbsp;
<a n:href="default, $paginator->page-1">{_('pagination.prev')}</a>
&nbsp;|&nbsp;
{/if}
Stránka {$paginator->getPage()} z {$paginator->getPageCount()}
{if !$paginator->isLast()}
&nbsp;|&nbsp;
<a n:href="default, $paginator->getPage() + 1">{_('pagination.next')}</a>
&nbsp;|&nbsp;
<a n:href="default, $paginator->getPageCount()">{_('pagination.last')}</a>
{/if}
</div>
{/if}
{/block}