diff --git a/src/Controller/Admin/Autocomplete/UserController.php b/src/Controller/Admin/Autocomplete/UserController.php new file mode 100644 index 0000000..4d154fe --- /dev/null +++ b/src/Controller/Admin/Autocomplete/UserController.php @@ -0,0 +1,34 @@ +getContent(), true, 512, JSON_THROW_ON_ERROR); + $queryString = $query['search']; + } catch (\JsonException $e) { + throw $this->createNotFoundException(); + } + + $role = $request->query->get('role'); + + $users = $this->userRepository->getAutocompletionData($queryString, $role); + + return $this->json($users); + } +} \ No newline at end of file diff --git a/src/Controller/Admin/Feedback/ProvideController.php b/src/Controller/Admin/Feedback/ProvideController.php index 0d91fb0..efd6104 100644 --- a/src/Controller/Admin/Feedback/ProvideController.php +++ b/src/Controller/Admin/Feedback/ProvideController.php @@ -4,21 +4,22 @@ namespace App\Controller\Admin\Feedback; use App\Entity\Feedback; use App\Entity\User; +use App\Event\FeedbackProvidedEvent; use App\Form\AdminFeedbackType; use Doctrine\ORM\EntityManagerInterface; -use Psr\Log\LoggerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\FormInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Security\Http\Attribute\IsGranted; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; class ProvideController extends AbstractController { public function __construct( private readonly EntityManagerInterface $entityManager, - private readonly LoggerInterface $logger + private readonly EventDispatcherInterface $eventDispatcher ) { } @@ -32,12 +33,17 @@ class ProvideController extends AbstractController if ($form->isSubmitted() && $form->isValid()) { $feedback = $form->getData(); + if (null !== $form->get('authorOverride')->getData()) { + $feedback->setAuthor($form->get('authorOverride')->getData()); + } + $this->entityManager->persist($feedback); $this->entityManager->flush(); - $this->logger->info('Provided feedback', [ - 'teamer' => $feedback->getTeamer()->getUuid(), - ]); + $this->eventDispatcher->dispatch( + new FeedbackProvidedEvent($feedback), + FeedbackProvidedEvent::NAME + ); return $this->redirectToRoute('app_administrative_feedback_index'); } diff --git a/src/Form/AdminFeedbackType.php b/src/Form/AdminFeedbackType.php index d96a953..58bb787 100644 --- a/src/Form/AdminFeedbackType.php +++ b/src/Form/AdminFeedbackType.php @@ -2,10 +2,10 @@ namespace App\Form; -use App\Entity\Destination; use App\Entity\Feedback; use App\Entity\FeedbackSet; use App\Entity\Teamer; +use App\Entity\User; use App\Repository\FeedbackSetRepository; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; @@ -32,6 +32,17 @@ class AdminFeedbackType extends AbstractType 'label_function' => fn(Teamer $teamer) => (string) $teamer, 'endpoint_route' => 'app_admin_autocomplete_teamer', ]) + ->add('authorOverride', AutocompleteEntityType::class, [ + 'mapped' => false, + 'label' => 'abweichender Absender', + 'class' => User::class, + 'label_property' => 'lastName', + 'label_function' => fn(User $user) => (string) $user, + 'endpoint_route' => 'app_admin_autocomplete_user', + 'endpoint_parameters' => [ + 'role' => 'ROLE_HOUSE_MANAGER', + ], + ]) ->add('feedbackSet', EntityType::class, [ 'label' => 'Feedbackvorlage', 'class' => FeedbackSet::class, diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index 34e2d70..479e310 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -3,6 +3,7 @@ namespace App\Repository; use App\Entity\User; +use App\Repository\Traits\QueryHelperTrait; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; @@ -16,6 +17,8 @@ use Doctrine\Persistence\ManagerRegistry; */ class UserRepository extends ServiceEntityRepository { + use QueryHelperTrait; + public function __construct(ManagerRegistry $registry) { parent::__construct($registry, User::class); @@ -67,4 +70,41 @@ class UserRepository extends ServiceEntityRepository ->getResult() ; } + + public function getAutocompletionData(string $search, string $role): array + { + $qb = $this->createQueryBuilder('user'); + + $users = $qb + ->where($qb->expr()->andX( + $qb->expr()->orX( + $qb->expr()->like('user.lastName', ':search'), + $qb->expr()->like('user.firstName', ':search'), + )), + $qb->expr()->like('user.roles', ':role') + ) + ->orderBy('user.lastName', 'ASC') + ->addOrderBy('user.firstName', 'ASC') + ->setParameter('search', '%'.$this->escapeLikeWildcards($search).'%') + ->setParameter('role', '%"'.$this->escapeLikeWildcards($role).'"%') + ->getQuery() + ->getResult() + ; + + $data = [ + [ + 'value' => '', + 'text' => '...', + ], + ]; + + foreach ($users as $user) { + $data[] = [ + 'value' => $user->getId(), + 'text' => (string) $user, + ]; + } + + return $data; + } } diff --git a/templates/admin/feedback/provide.html.twig b/templates/admin/feedback/provide.html.twig index 3d33b9b..305795e 100644 --- a/templates/admin/feedback/provide.html.twig +++ b/templates/admin/feedback/provide.html.twig @@ -12,6 +12,9 @@
{{ form_row(form.teamer) }}
+
+ {{ form_row(form.authorOverride) }} +
{{ form_row(form.feedbackSet, { 'attr': { 'hx-post': path('app_admin_feedback_provide_form'), diff --git a/templates/teamer/feedback/modal.html.twig b/templates/teamer/feedback/modal.html.twig index 30a198f..585b95d 100644 --- a/templates/teamer/feedback/modal.html.twig +++ b/templates/teamer/feedback/modal.html.twig @@ -5,10 +5,14 @@ {% block content %}
- Einsatz: {{ feedback.destinationName }} -
- Einsatzzeitraum: {{ feedback.assignmentDateFrom|date('d.m.Y') }} - {{ feedback.assignmentDateTo|date('d.m.Y') }} -
+ {% if feedback.destinationName %} + Einsatz: {{ feedback.destinationName }} +
+ {% endif %} + {% if feedback.assignmentDateFrom and feedback.assignmentDateTo %} + Einsatzzeitraum: {{ feedback.assignmentDateFrom|date('d.m.Y') }} - {{ feedback.assignmentDateTo|date('d.m.Y') }} +
+ {% endif %} Feedback von: {{ feedback.author }}
diff --git a/templates/teamer/index.html.twig b/templates/teamer/index.html.twig index 4289039..180b774 100644 --- a/templates/teamer/index.html.twig +++ b/templates/teamer/index.html.twig @@ -92,7 +92,7 @@ {% for feedback in recentFeedback %}