feat: filter documents

This commit is contained in:
Björn Fromme
2024-08-27 12:38:19 +02:00
parent 5ac77e9e9c
commit bcaab582cc
12 changed files with 476 additions and 191 deletions
@@ -0,0 +1,60 @@
<?php
namespace App\Service\Common;
use App\Model\AbstractFilterDto;
use App\Model\AssignmentFilterDto;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
abstract class AbstractFilterHandler
{
protected string $namespace = 'filter:default';
public function __construct(
protected readonly RequestStack $requestStack,
protected readonly EntityManagerInterface $entityManager
) {
}
public function setNamespace(string $namespace): static
{
$this->namespace = $namespace;
return $this;
}
public function handleRequest(FormInterface $form): AbstractFilterDto
{
$filterDto = $form->getData();
if ($form->get('reset')->isClicked()) {
$filterDto = new AssignmentFilterDto();
$this->resetFilterSettings();
} elseif ($form->get('apply')->isClicked()) {
$this->saveFilterSettings($filterDto);
}
return $filterDto;
}
public function resetFilterSettings(): void
{
$this->getSession()->remove($this->namespace);
}
public function getFilterSettings(): AbstractFilterDto
{
}
protected function saveFilterSettings(AbstractFilterDto $filterDto): void
{
}
protected function getSession(): SessionInterface
{
return $this->requestStack->getSession();
}
}
+5 -44
View File
@@ -3,47 +3,12 @@
namespace App\Service\Common;
use App\Entity\JobProfile;
use App\Model\AbstractFilterDto;
use App\Model\AssignmentFilterDto;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class AssignmentFilterHandler
class AssignmentFilterHandler extends AbstractFilterHandler
{
private string $namespace = 'filter:assignment';
public function __construct(
private readonly RequestStack $requestStack,
private readonly EntityManagerInterface $entityManager
) {
}
public function setNamespace(string $namespace): static
{
$this->namespace = $namespace;
return $this;
}
public function handleRequest(FormInterface $form): AssignmentFilterDto
{
$filterDto = $form->getData();
if ($form->get('reset')->isClicked()) {
$filterDto = new AssignmentFilterDto();
$this->resetFilterSettings();
} elseif ($form->get('apply')->isClicked()) {
$this->saveFilterSettings($filterDto);
}
return $filterDto;
}
public function resetFilterSettings(): void
{
$this->getSession()->remove($this->namespace);
}
protected string $namespace = 'filter:assignment';
public function getFilterSettings(): AssignmentFilterDto
{
@@ -83,8 +48,9 @@ class AssignmentFilterHandler
return $filterDto;
}
private function saveFilterSettings(AssignmentFilterDto $filterDto): void
protected function saveFilterSettings(AbstractFilterDto $filterDto): void
{
/** @var AssignmentFilterDto $filterDto */
$this->getSession()->set($this->namespace, [
'date_from' => $filterDto->getDateFrom(),
'date_to' => $filterDto->getDateTo(),
@@ -97,9 +63,4 @@ class AssignmentFilterHandler
'include_past' => $filterDto->isIncludePast(),
]);
}
private function getSession(): SessionInterface
{
return $this->requestStack->getSession();
}
}
@@ -0,0 +1,49 @@
<?php
namespace App\Service\Common;
use App\Entity\Teamer;
use App\Model\AbstractFilterDto;
use App\Model\DocumentFilterDto;
class DocumentFilterHandler extends AbstractFilterHandler
{
protected string $namespace = 'filter:document';
public function getFilterSettings(): DocumentFilterDto
{
if (null === $data = $this->getSession()->get($this->namespace)) {
return new DocumentFilterDto();
}
$filterDto = new DocumentFilterDto();
$filterDto
->setType($data['type'])
->setDateFrom($data['date_from'])
->setDateTo($data['date_to'])
;
if (isset($data['teamer_id'])) {
$teamer = $this
->entityManager
->getRepository(Teamer::class)
->find($data['teamer_id'])
;
$filterDto->setTeamer($teamer);
}
return $filterDto;
}
protected function saveFilterSettings(AbstractFilterDto $filterDto): void
{
/** @var DocumentFilterDto $filterDto */
$this->getSession()->set($this->namespace, [
'teamer_id' => $filterDto->getTeamer()?->getId(),
'type' => $filterDto->getType(),
'date_from' => $filterDto->getDateFrom(),
'date_to' => $filterDto->getDateTo(),
]);
}
}
+5 -44
View File
@@ -3,47 +3,12 @@
namespace App\Service\Common;
use App\Entity\JobProfile;
use App\Model\AbstractFilterDto;
use App\Model\TeamerFilterDto;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class TeamerFilterHandler
class TeamerFilterHandler extends AbstractFilterHandler
{
private string $namespace = 'filter:teamer';
public function __construct(
private readonly RequestStack $requestStack,
private readonly EntityManagerInterface $entityManager
) {
}
public function setNamespace(string $namespace): static
{
$this->namespace = $namespace;
return $this;
}
public function handleRequest(FormInterface $form): TeamerFilterDto
{
$filterDto = $form->getData();
if ($form->get('reset')->isClicked()) {
$filterDto = new TeamerFilterDto();
$this->resetFilterSettings();
} elseif ($form->get('apply')->isClicked()) {
$this->saveFilterSettings($filterDto);
}
return $filterDto;
}
public function resetFilterSettings(): void
{
$this->getSession()->remove($this->namespace);
}
protected string $namespace = 'filter:teamer';
public function getFilterSettings(): TeamerFilterDto
{
@@ -74,8 +39,9 @@ class TeamerFilterHandler
return $filterDto;
}
private function saveFilterSettings(TeamerFilterDto $filterDto): void
protected function saveFilterSettings(AbstractFilterDto $filterDto): void
{
/** @var TeamerFilterDto $filterDto */
$this->getSession()->set($this->namespace, [
'name' => $filterDto->getName(),
'available_at' => $filterDto->getAvailableAt(),
@@ -88,9 +54,4 @@ class TeamerFilterHandler
}, $filterDto->getJobProfiles()),
]);
}
private function getSession(): SessionInterface
{
return $this->requestStack->getSession();
}
}