src/Controller/UserGroupController.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use App\Entity\UserGroup;
  5. use App\Form\UserGroupType;
  6. use App\Utils\Datatable;
  7. use Doctrine\Common\Collections\ArrayCollection;
  8. use Exception;
  9. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\JsonResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use App\Repository\UserGroupRepository;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  18. /**
  19.  * @Route("/user-group")
  20.  */
  21. class UserGroupController extends AbstractController
  22. {
  23.     /**
  24.      * Frontend User Group List
  25.      * @Route("/list", name="user_group" ,methods={"GET","POST"})
  26.      * @IsGranted("USER_GROUP_VIEW")
  27.      */
  28.     public function index(): Response
  29.     {
  30.         return $this->render('user_group/index.html.twig');
  31.     }
  32.     /**
  33.      * Fetch frontend User Group List for datatable
  34.      * @Route("/fetch/list", name="fetch_user_group_list", methods={"GET"})
  35.      * @IsGranted("USER_GROUP_VIEW")
  36.      * @param Request $request
  37.      * @param Datatable $datatable
  38.      * @param UserGroupRepository $userGroupRepository
  39.      * @return Response
  40.      * @throws Exception
  41.      */
  42.     public function fetchUserList(Request $requestDatatable $datatableUserGroupRepository $userGroupRepository): Response
  43.     {
  44.         /** @var User $user */
  45.         $user $this->getUser();
  46.         $datatables $datatable
  47.             ->withColumnType([ // list column in order
  48.                 'id' => ['alias' => 'ug'],
  49.                 'groupName' => ['alias' => 'ug''twig' => 'user_group/datatable.link.twig'], // type link, badge or circular status twig
  50.                 'noOfMember' => [],
  51.                 'additionalInfo' => ['alias' => 'ug'],
  52.                 'userGroups' => ['alias' => 'ug']
  53.             ])
  54.             ->renderActionView('user_group/datatable.action.twig'// provide custom twig to render action column
  55.             ->withQueryBuilder($userGroupRepository->findUserGroupsByRole($user->getWorkspace()))
  56.             ->withRequestParams($request->query->all());
  57.         return new JsonResponse($datatables->getResponse());
  58.     }
  59.     /**
  60.      * Add New Frontend User Group
  61.      * @Route("/new", name="user_group_new" ,methods={"GET","POST"})
  62.      * @Security("is_granted('USER_GROUP_CREATE') and is_granted('VIEW_PLAN_USER_GROUP', user)")
  63.      * @param Request $request
  64.      * @param TranslatorInterface $translator
  65.      * @return Response
  66.      * @throws Exception
  67.      */
  68.     public function new(Request $requestTranslatorInterface $translator): Response
  69.     {
  70.         /** @var User $owner */
  71.         $owner $this->getUser();
  72.         $userGroup = new UserGroup();
  73.         $form $this->createForm(UserGroupType::class, $userGroup, ['is_new' => true'user' => $this->getUser(), 'action' => $this->generateUrl('user_group_new'), 'attr' => ['class' => 'ajax-form']]);
  74.         $originalTags = new ArrayCollection();
  75.         foreach ($userGroup->getUsers() as $tag) {
  76.             $originalTags->add($tag);
  77.         }
  78.         $form->handleRequest($request);
  79.         if ($form->isSubmitted()) {
  80.             /** Return Form with Errors if not validated else submit and send response **/
  81.             if (!$form->isValid()) {
  82.                 if ($request->isXmlHttpRequest()) {
  83.                     $html $this->renderView('user_group/new.html.twig', [
  84.                         'user' => $userGroup,
  85.                         'form' => $form->createView(),
  86.                     ]);
  87.                     return new Response($html400);
  88.                 }
  89.             } else {
  90.                 $userGroup->setCreatedBy($owner->getId());
  91.                 $em $this->getDoctrine()->getManager();
  92.                 foreach ($originalTags as $tag) {
  93.                     if (false === $userGroup->getUsers()->contains($tag)) {
  94.                         $tag->getUserGroups()->removeElement($userGroup);
  95.                     }
  96.                 }
  97.                 foreach ($userGroup->getUsers() as $user) {
  98.                     $user->addUserGroup($userGroup);
  99.                 }
  100.                 $workspace $owner->getWorkspace();
  101.                 $workspace->addUserGroup($userGroup);
  102.                 $userGroup->setWorkspace($workspace);
  103.                 $em->persist($userGroup);
  104.                 $em->flush();
  105.                 $data['status'] = 'success';
  106.                 $data['msg'] = $translator->trans('msg.save_user_group');
  107.                 return new JsonResponse(array('data' => $data));
  108.             }
  109.         }
  110.         return $this->render('user_group/new.html.twig', [
  111.             'user' => $userGroup,
  112.             'form' => $form->createView(),
  113.         ]);
  114.     }
  115.     /**
  116.      * Frontend User Group Show details
  117.      * @Route("/show/{id}", name="user_group_show", methods={"GET"})
  118.      * @IsGranted("USER_GROUP_SHOW", subject="userGroup")
  119.      * @param UserGroup $userGroup
  120.      * @return Response
  121.      * @throws Exception
  122.      */
  123.     public function show(UserGroup $userGroup): Response
  124.     {
  125.         return $this->render('user_group/show.html.twig', [
  126.             'userGroup' => $userGroup,
  127.         ]);
  128.     }
  129.     /**
  130.      * Edit Frontend User Group
  131.      * @Route("/edit/{id}", name="user_group_edit", methods={"GET","POST"})
  132.      * @Security("is_granted('USER_GROUP_EDIT', userGroup) and is_granted('VIEW_PLAN_USER_GROUP',user)")
  133.      * @param Request $request
  134.      * @param TranslatorInterface $translator
  135.      * @param UserGroup $userGroup
  136.      * @return Response
  137.      * @throws Exception
  138.      */
  139.     public function edit(Request $requestTranslatorInterface $translatorUserGroup $userGroup): Response
  140.     {
  141.         $editform $this->createForm(UserGroupType::class, $userGroup, ['user' => $this->getUser(), 'action' => $this->generateUrl('user_group_edit', ['id' => $userGroup->getId()]), 'attr' => ['class' => 'ajax-form']]);
  142.         $originalTags = new ArrayCollection();
  143.         foreach ($userGroup->getUsers() as $tag) {
  144.             $originalTags->add($tag);
  145.         }
  146.         $editform->handleRequest($request);
  147.         if ($editform->isSubmitted()) {
  148.             /** Return Form with Errors if not validated else submit and send response **/
  149.             if (!$editform->isValid()) {
  150.                 if ($request->isXmlHttpRequest()) {
  151.                     $html $this->renderView('user_group/edit-modal.html.twig', [
  152.                         'user' => $userGroup,
  153.                         'form' => $editform->createView(),
  154.                     ]);
  155.                     return new Response($html400);
  156.                 }
  157.             } else {
  158.                 $em $this->getDoctrine()->getManager();
  159.                 foreach ($originalTags as $tag) {
  160.                     /** If any user is Removed then remove the  relational UserGroup **/
  161.                     if (false === $userGroup->getUsers()->contains($tag)) {
  162.                         $tag->getUserGroups()->removeElement($userGroup);
  163.                     }
  164.                 }
  165.                 foreach ($userGroup->getUsers() as $user) {
  166.                     $user->addUserGroup($userGroup);
  167.                 }
  168.                 $em->persist($userGroup);
  169.                 $em->flush();
  170.                 $data['status'] = 'success';
  171.                 $data['msg'] = $translator->trans('msg.update_user_group');
  172.                 return new JsonResponse(array('data' => $data));
  173.             }
  174.         }
  175.         return $this->render('user_group/edit-modal.html.twig', [
  176.             'user' => $userGroup,
  177.             'form' => $editform->createView(),
  178.         ]);
  179.     }
  180.     /**
  181.      * Clone Frontend User Group
  182.      * @Route("/{id}/clone", name="user_group_clone", methods={"GET","POST"})
  183.      * @Security("is_granted('USER_GROUP_CLONE', userGroup) and is_granted('VIEW_PLAN_USER_GROUP',user)")
  184.      * @param Request $request
  185.      * @param TranslatorInterface $translator
  186.      * @param UserGroup $userGroup
  187.      * @return Response
  188.      * @throws Exception
  189.      */
  190.     public function clone(Request $requestTranslatorInterface $translatorUserGroup $userGroup): Response
  191.     {
  192.         /** @var User $owner */
  193.         $owner $this->getUser();
  194.         $newUserGroup = new UserGroup();
  195.         /** Copy All Data to New Group */
  196.         $newUserGroup->setGroupName($userGroup->getGroupName() . '-Clone');
  197.         foreach ($userGroup->getUsers() as $user) {
  198.             $newUserGroup->addUser($user);
  199.             $user->addUserGroup($userGroup);
  200.         }
  201.         if ($userGroup->getAdditionalInfo() != null) {
  202.             $newUserGroup->setAdditionalInfo($userGroup->getAdditionalInfo());
  203.         }
  204.         $newUserGroup->setWorkspace($owner->getWorkspace());
  205.         $newUserGroup->setPermission($userGroup->getPermission());
  206.         $newUserGroup->setCreatedBy($owner->getId());
  207.         $editform $this->createForm(UserGroupType::class, $newUserGroup, ['user' => $this->getUser(), 'action' => $this->generateUrl('user_group_clone', ['id' => $userGroup->getId()]), 'attr' => ['class' => 'ajax-form']]);
  208.         $editform->handleRequest($request);
  209.         if ($editform->isSubmitted()) {
  210.             /** Return Form with Errors if not validated else submit and send response **/
  211.             if (!$editform->isValid()) {
  212.                 if ($request->isXmlHttpRequest()) {
  213.                     $html $this->renderView('backend_group/edit-modal.html.twig', [
  214.                         'user' => $newUserGroup,
  215.                         'form' => $editform->createView(),
  216.                     ]);
  217.                     return new Response($html400);
  218.                 }
  219.             } else {
  220.                 $em $this->getDoctrine()->getManager();
  221.                 foreach ($newUserGroup->getUsers() as $user) {
  222.                     $user->addUserGroup($newUserGroup);
  223.                 }
  224.                 $em->persist($newUserGroup);
  225.                 $em->flush();
  226.                 $data['status'] = 'success';
  227.                 $data['msg'] = $translator->trans('msg.clone_user_group');
  228.                 return new JsonResponse(array('data' => $data));
  229.             }
  230.         }
  231.         return $this->render('user_group/clone.html.twig', [
  232.             'user' => $newUserGroup,
  233.             'form' => $editform->createView(),
  234.         ]);
  235.     }
  236.     /**
  237.      * Delete Frontend User Group
  238.      * @Route("/delete/{id}", name="user_group_delete", methods={"POST"})
  239.      * @Security("is_granted('USER_GROUP_DELETE', userGroup) and is_granted('VIEW_PLAN_USER_GROUP',user)")
  240.      * @param Request $request
  241.      * @param TranslatorInterface $translator
  242.      * @param UserGroup $userGroup
  243.      * @return Response
  244.      * @throws Exception
  245.      */
  246.     public function delete(Request $requestTranslatorInterface $translatorUserGroup $userGroup): Response
  247.     {
  248.         if (!$request->isXmlHttpRequest()) {
  249.             throw $this->createAccessDeniedException("Not an ajax request!");
  250.         }
  251.         if ($this->isCsrfTokenValid('delete' $userGroup->getId(), $request->request->get('_token'))) {
  252.             $entityManager $this->getDoctrine()->getManager();
  253.             $entityManager->remove($userGroup);
  254.             $entityManager->flush();
  255.         }
  256.         $data['status'] = 'success';
  257.         $data['msg'] = $translator->trans('msg.delete_user_group');
  258.         return new JsonResponse(array('data' => $data));
  259.     }
  260.     /**
  261.      * Delete Bulk Frontend UserGroup
  262.      * @Route("/delete/usergroups", name="delete_usergroups", methods={"POST"})
  263.      * @Security("is_granted('USER_GROUP_MULTI_DELETE') and is_granted('VIEW_PLAN_USER_GROUP',user)")
  264.      * @param Request $request
  265.      * @return Response
  266.      * @throws Exception
  267.      */
  268.     public function deleteUserGroups(Request $request): Response
  269.     {
  270.         if (!$request->isXmlHttpRequest()) {
  271.             throw $this->createAccessDeniedException("Not an ajax request!");
  272.         }
  273.         /** @var User $user */
  274.         $user $this->getUser();
  275.         $data explode(','$request->request->get('data_ids'));
  276.         $em $this->getDoctrine()->getManager();
  277.         foreach ($data as $id) {
  278.             $userGroup $em->getRepository(UserGroup::class)->findOneBy(["id" => $id"workspace" => $user->getWorkspace()->getId()]);
  279.             if (is_object($userGroup)){
  280.                 $em->remove($userGroup);
  281.             }
  282.         }
  283.         $em->flush();
  284.         return new Response('success');
  285.     }
  286. }