Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

171 line
5.7KB

  1. <?php
  2. namespace Lc\SovBundle\Controller\Ticket;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
  5. use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
  6. use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
  7. use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
  8. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  9. use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
  10. use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
  11. use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
  12. use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
  13. use Lc\SovBundle\Container\Ticket\TicketMessageContainer;
  14. use Lc\SovBundle\Definition\ActionDefinition;
  15. use Lc\SovBundle\Event\Ticket\TicketEvent;
  16. use Lc\SovBundle\Form\Ticket\TicketMessageAdminFormType;
  17. use Lc\SovBundle\Form\Ticket\TicketStatusType;
  18. use Lc\SovBundle\Controller\AbstractAdminController;
  19. use Lc\SovBundle\Model\Ticket\TicketModel;
  20. use Lc\SovBundle\Repository\RepositoryQueryInterface;
  21. use Symfony\Component\HttpFoundation\JsonResponse;
  22. use Symfony\Component\HttpFoundation\RequestStack;
  23. abstract class TicketAdminController extends AbstractAdminController
  24. {
  25. public function getRepositoryQuery(): RepositoryQueryInterface
  26. {
  27. return $this->getTicketContainer()->getRepositoryQuery();
  28. }
  29. public function createEntity(string $entityFqcn)
  30. {
  31. $ticket = $this->getTicketContainer()->getFactory()->create();
  32. return $ticket;
  33. }
  34. public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
  35. {
  36. parent::persistEntity($entityManager, $entityInstance);
  37. $this->getEventDispatcher()->dispatch(new TicketEvent($entityInstance), TicketEvent::NEW_TICKET_EVENT);
  38. }
  39. public function configureCrud(Crud $crud): Crud
  40. {
  41. $crud = parent::configureCrud($crud); // TODO: Change the autogenerated stub
  42. $crud->setDefaultSort(array('updatedAt' => 'DESC'));
  43. return $crud;
  44. }
  45. public function configureFields(string $pageName): iterable
  46. {
  47. return $this->getTicketContainer()->getFieldDefinition()->getFields($pageName);
  48. }
  49. public function configureAssets(Assets $assets): Assets
  50. {
  51. $assets = parent::configureAssets($assets);
  52. $assets->addWebpackEncoreEntry('sov-ticket');
  53. return $assets;
  54. }
  55. public function configureActions(Actions $actions): Actions
  56. {
  57. $actions->add(Crud::PAGE_INDEX, ActionDefinition::DETAIL);
  58. $actions = parent::configureActions($actions);
  59. $actions->disable( ActionDefinition::EDIT, ActionDefinition::DUPLICATE);
  60. return $actions;
  61. }
  62. public function createIndexRepositoryQuery(
  63. SearchDto $searchDto,
  64. EntityDto $entityDto,
  65. FieldCollection $fields,
  66. FilterCollection $filters
  67. ): RepositoryQueryInterface {
  68. $repositoryQuery = parent::createIndexRepositoryQuery(
  69. $searchDto,
  70. $entityDto,
  71. $fields,
  72. $filters
  73. );
  74. if(!$this->isRepositoryQueryFiltered()){
  75. $repositoryQuery->filterByStatus(array(
  76. TicketModel::TICKET_STATUS_OPEN,
  77. TicketModel::TICKET_STATUS_BEING_PROCESSED,
  78. TicketModel::TICKET_STATUS_PROCESSED
  79. ));
  80. }
  81. return $repositoryQuery;
  82. }
  83. public function detail(AdminContext $context)
  84. {
  85. $adminUrlGenerator = $this->get(AdminUrlGenerator::class);
  86. $ticket = $context->getEntity()->getInstance();
  87. $url = $adminUrlGenerator
  88. ->setAction('ticketStatusAction')
  89. ->generateUrl();
  90. $formTicketStatus = $this->createForm(
  91. TicketStatusType::class,
  92. $ticket,
  93. [
  94. 'action' => $url,
  95. 'method' => 'POST',
  96. ]
  97. );
  98. $ticketMessage = $this->get(TicketMessageContainer::class)->getFactory()->create($ticket);
  99. $formAddTicketMessage = $this->createForm(TicketMessageAdminFormType::class, $ticketMessage);
  100. $formAddTicketMessage->handleRequest($this->get(RequestStack::class)->getMainRequest());
  101. if ($formAddTicketMessage->isSubmitted() && $formAddTicketMessage->isValid()) {
  102. $ticketMessage = $formAddTicketMessage->getData();
  103. $ticketMessage->setTicket($ticket);
  104. $ticketMessage->setAnswerByAdmin(true);
  105. $this->get(EntityManagerInterface::class)->create($ticketMessage);
  106. $this->get(EntityManagerInterface::class)->flush();
  107. $this->getEventDispatcher()->dispatch(new TicketEvent($ticket), TicketEvent::NEW_MESSAGE_EVENT);
  108. return $this->redirect($this->generateEaUrl());
  109. }
  110. return $this->render(
  111. '@LcSov/admin/ticket/detail.html.twig',
  112. [
  113. 'form_ticket_status' => $formTicketStatus->createView(),
  114. 'form_add_ticket_message' => $formAddTicketMessage->createView(),
  115. 'ticket' => $ticket,
  116. ]
  117. );
  118. }
  119. public function ticketStatusAction(AdminContext $context, EntityManagerInterface $entityManager)
  120. {
  121. $ticket = $context->getEntity()->getInstance();
  122. $formTicketStatusForm = $this->createForm(TicketStatusType::class, $ticket);
  123. $formTicketStatusForm->handleRequest($context->getRequest());
  124. $success = false;
  125. if ($formTicketStatusForm->isSubmitted() && $formTicketStatusForm->isValid()) {
  126. $entityManager->update($ticket);
  127. $entityManager->flush();
  128. $success = true;
  129. }
  130. return new JsonResponse(['success' => $success]);
  131. }
  132. }