Merge branch 'master' into develop

This commit is contained in:
Björn Fromme
2024-07-16 17:34:56 +02:00
13 changed files with 161 additions and 41 deletions
@@ -2,6 +2,7 @@
namespace App\Controller\Administrative\Assignment;
use App\Controller\Traits\ReturnUrlTrait;
use App\Entity\Assignment;
use App\Entity\User;
use App\Form\AssignmentType;
@@ -15,6 +16,8 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
class CreateController extends AbstractController
{
use ReturnUrlTrait;
public function __construct(
private readonly EntityManagerInterface $entityManager,
private readonly LoggerInterface $logger
@@ -29,6 +32,7 @@ class CreateController extends AbstractController
$user = $this->getUser();
$assignment = new Assignment();
$assignment->setOwner($user);
$returnUrl = $this->getReturnUrl($request, 'app_administrative_assignment_index');
$form = $this->createForm(
AssignmentType::class,
@@ -51,11 +55,12 @@ class CreateController extends AbstractController
'job_profile' => $assignment->getJobProfile()->getName(),
]);
return $this->redirectToRoute('app_administrative_assignment_index');
return $this->redirectToRoute($returnUrl);
}
return $this->render('administrative/assignment/create.html.twig', [
'form' => $form->createView(),
'returnUrl' => $returnUrl,
]);
}
}
@@ -2,7 +2,6 @@
namespace App\Controller\Common;
use App\Controller\Traits\ReturnUrlTrait;
use App\Form\AssignmentFilterType;
use App\Htmx\HxRedirectResponse;
use App\Repository\AssignmentRepository;
@@ -15,8 +14,6 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
class AssignmentFilterController extends AbstractController
{
use ReturnUrlTrait;
public function __construct(
private readonly AssignmentFilterHandler $filterHandler,
private readonly AssignmentRepository $assignmentRepository
@@ -41,9 +38,8 @@ class AssignmentFilterController extends AbstractController
if ($form->isSubmitted() && $form->isValid()) {
$this->filterHandler->handleRequest($form);
$returnUrl = $this->getReturnUrl($request, 'app_administrative_assignment_index');
return new HxRedirectResponse($returnUrl);
return new HxRedirectResponse($this->generateUrl('app_administrative_assignment_index'));
}
return $this->render('common/modal_assignment_filter.html.twig', [
@@ -56,8 +52,7 @@ class AssignmentFilterController extends AbstractController
public function reset(Request $request): Response
{
$this->filterHandler->resetFilterSettings();
$returnUrl = $this->getReturnUrl($request, 'app_administrative_assignment_index');
return $this->redirect($returnUrl);
return $this->redirectToRoute('app_administrative_assignment_index');
}
}
+4 -4
View File
@@ -80,11 +80,11 @@ class AssignmentFilterType extends AbstractType
if (0 < count($options['job_profiles'])) {
$builder
->add('jobProfile', EntityType::class, [
->add('jobProfiles', MultiselectEntityType::class, [
'label' => 'Job-Profil',
'class' => JobProfile::class,
'required' => false,
'placeholder' => 'nicht filtern',
'empty_label' => 'nicht filtern',
'choice_label' => 'name',
'choices' => $options['job_profiles'],
])
@@ -96,10 +96,10 @@ class AssignmentFilterType extends AbstractType
$choices[$item->getHotel()] = $item->getHotelCode();
}
$builder
->add('hotel', ChoiceType::class, [
->add('hotels', MultiselectType::class, [
'label' => 'Haus',
'required' => false,
'placeholder' => 'nicht filtern',
'empty_label' => 'nicht filtern',
'choices' => $choices,
])
;
+1 -1
View File
@@ -67,7 +67,7 @@ class AssignmentType extends AbstractType
}
])
->add('jobProfileInfo', TextareaType::class, [
'label' => 'Jobprofil Zusatzinfo',
'label' => 'Zusatzinfos',
'required' => false,
'attr' => [
'rows' => 3,
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Form;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
class MultiselectEntityType extends AbstractType
{
public function getParent(): string
{
return EntityType::class;
}
public function buildView(FormView $view, FormInterface $form, array $options): void
{
$view->vars['empty_label'] = $options['empty_label'];
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'multiple' => true,
'expanded' => true,
'empty_label' => null,
]);
}
public function getBlockPrefix(): string
{
return 'multiselect';
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
class MultiselectType extends AbstractType
{
public function getParent(): string
{
return ChoiceType::class;
}
public function buildView(FormView $view, FormInterface $form, array $options): void
{
$view->vars['empty_label'] = $options['empty_label'];
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'multiple' => true,
'expanded' => true,
'empty_label' => null,
]);
}
public function getBlockPrefix(): string
{
return 'multiselect';
}
}
+10 -10
View File
@@ -14,8 +14,8 @@ class AssignmentFilterDto extends AbstractFilterDto
protected ?\DateTimeImmutable $dateFrom = null;
protected ?\DateTimeImmutable $dateTo = null;
protected ?JobProfile $jobProfile = null;
protected ?string $hotel = null;
protected array $jobProfiles = [];
protected array $hotels = [];
protected ?int $duration = null;
protected array $status = [];
protected bool $includePast = false;
@@ -44,26 +44,26 @@ class AssignmentFilterDto extends AbstractFilterDto
return $this;
}
public function getJobProfile(): ?JobProfile
public function getJobProfiles(): array
{
return $this->jobProfile;
return $this->jobProfiles;
}
public function setJobProfile(?JobProfile $jobProfile): static
public function setJobProfiles(array $jobProfiles): static
{
$this->jobProfile = $jobProfile;
$this->jobProfiles = $jobProfiles;
return $this;
}
public function getHotel(): ?string
public function getHotels(): ?array
{
return $this->hotel;
return $this->hotels;
}
public function setHotel(?string $hotel): static
public function setHotels(array $hotels): static
{
$this->hotel = $hotel;
$this->hotels = $hotels;
return $this;
}
+6 -6
View File
@@ -137,17 +137,17 @@ class AssignmentRepository extends ServiceEntityRepository
;
}
if (null !== $jobProfile = $filterDto->getJobProfile()) {
if ($jobProfiles = $filterDto->getJobProfiles()) {
$qb
->andWhere($qb->expr()->eq('assignment.jobProfile', ':jobProfile'))
->setParameter('jobProfile', $jobProfile)
->andWhere($qb->expr()->in('assignment.jobProfile', ':jobProfiles'))
->setParameter('jobProfiles', $jobProfiles)
;
}
if (null !== $hotelCode = $filterDto->getHotel()) {
if ($hotelCodes = $filterDto->getHotels()) {
$qb
->andWhere($qb->expr()->eq('destination.hotelCode', ':hotelCode'))
->setParameter('hotelCode', $hotelCode)
->andWhere($qb->expr()->in('destination.hotelCode', ':hotelCodes'))
->setParameter('hotelCodes', $hotelCodes)
;
}
+10 -8
View File
@@ -59,16 +59,16 @@ class AssignmentFilterHandler
if (isset($data['date_to'])) {
$filterDto->setDateTo($data['date_to']);
}
if (isset($data['job_profile']) && 0 < (int) $data['job_profile']) {
$jobProfile = $this
if (isset($data['job_profiles']) && 0 < count($data['job_profiles'])) {
$jobProfiles = $this
->entityManager
->getRepository(JobProfile::class)
->find($data['job_profile'])
->findBy(['id' => $data['job_profiles']])
;
$filterDto->setJobProfile($jobProfile);
$filterDto->setJobProfiles($jobProfiles);
}
if (isset($data['hotel'])) {
$filterDto->setHotel($data['hotel']);
if (isset($data['hotels']) && 0 < count($data['hotels'])) {
$filterDto->setHotels($data['hotels']);
}
if (isset($data['duration']) && 0 < (int) $data['duration']) {
$filterDto->setDuration($data['duration']);
@@ -88,8 +88,10 @@ class AssignmentFilterHandler
$this->getSession()->set($this->namespace, [
'date_from' => $filterDto->getDateFrom(),
'date_to' => $filterDto->getDateTo(),
'job_profile' => $filterDto->getJobProfile()?->getId(),
'hotel' => $filterDto->getHotel(),
'job_profiles' => array_map(function (JobProfile $jobProfile) {
return $jobProfile->getId();
}, $filterDto->getJobProfiles()),
'hotels' => $filterDto->getHotels(),
'duration' => $filterDto->getDuration(),
'status' => $filterDto->getStatus(),
'include_past' => $filterDto->isIncludePast(),