<?php
namespace App\Controller;
use App\Entity\User;
use App\Entity\UserGroup;
use App\Form\UserGroupType;
use App\Utils\Datatable;
use Doctrine\Common\Collections\ArrayCollection;
use Exception;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Repository\UserGroupRepository;
use Symfony\Contracts\Translation\TranslatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
/**
* @Route("/user-group")
*/
class UserGroupController extends AbstractController
{
/**
* Frontend User Group List
* @Route("/list", name="user_group" ,methods={"GET","POST"})
* @IsGranted("USER_GROUP_VIEW")
*/
public function index(): Response
{
return $this->render('user_group/index.html.twig');
}
/**
* Fetch frontend User Group List for datatable
* @Route("/fetch/list", name="fetch_user_group_list", methods={"GET"})
* @IsGranted("USER_GROUP_VIEW")
* @param Request $request
* @param Datatable $datatable
* @param UserGroupRepository $userGroupRepository
* @return Response
* @throws Exception
*/
public function fetchUserList(Request $request, Datatable $datatable, UserGroupRepository $userGroupRepository): Response
{
/** @var User $user */
$user = $this->getUser();
$datatables = $datatable
->withColumnType([ // list column in order
'id' => ['alias' => 'ug'],
'groupName' => ['alias' => 'ug', 'twig' => 'user_group/datatable.link.twig'], // type link, badge or circular status twig
'noOfMember' => [],
'additionalInfo' => ['alias' => 'ug'],
'userGroups' => ['alias' => 'ug']
])
->renderActionView('user_group/datatable.action.twig') // provide custom twig to render action column
->withQueryBuilder($userGroupRepository->findUserGroupsByRole($user->getWorkspace()))
->withRequestParams($request->query->all());
return new JsonResponse($datatables->getResponse());
}
/**
* Add New Frontend User Group
* @Route("/new", name="user_group_new" ,methods={"GET","POST"})
* @Security("is_granted('USER_GROUP_CREATE') and is_granted('VIEW_PLAN_USER_GROUP', user)")
* @param Request $request
* @param TranslatorInterface $translator
* @return Response
* @throws Exception
*/
public function new(Request $request, TranslatorInterface $translator): Response
{
/** @var User $owner */
$owner = $this->getUser();
$userGroup = new UserGroup();
$form = $this->createForm(UserGroupType::class, $userGroup, ['is_new' => true, 'user' => $this->getUser(), 'action' => $this->generateUrl('user_group_new'), 'attr' => ['class' => 'ajax-form']]);
$originalTags = new ArrayCollection();
foreach ($userGroup->getUsers() as $tag) {
$originalTags->add($tag);
}
$form->handleRequest($request);
if ($form->isSubmitted()) {
/** Return Form with Errors if not validated else submit and send response **/
if (!$form->isValid()) {
if ($request->isXmlHttpRequest()) {
$html = $this->renderView('user_group/new.html.twig', [
'user' => $userGroup,
'form' => $form->createView(),
]);
return new Response($html, 400);
}
} else {
$userGroup->setCreatedBy($owner->getId());
$em = $this->getDoctrine()->getManager();
foreach ($originalTags as $tag) {
if (false === $userGroup->getUsers()->contains($tag)) {
$tag->getUserGroups()->removeElement($userGroup);
}
}
foreach ($userGroup->getUsers() as $user) {
$user->addUserGroup($userGroup);
}
$workspace = $owner->getWorkspace();
$workspace->addUserGroup($userGroup);
$userGroup->setWorkspace($workspace);
$em->persist($userGroup);
$em->flush();
$data['status'] = 'success';
$data['msg'] = $translator->trans('msg.save_user_group');
return new JsonResponse(array('data' => $data));
}
}
return $this->render('user_group/new.html.twig', [
'user' => $userGroup,
'form' => $form->createView(),
]);
}
/**
* Frontend User Group Show details
* @Route("/show/{id}", name="user_group_show", methods={"GET"})
* @IsGranted("USER_GROUP_SHOW", subject="userGroup")
* @param UserGroup $userGroup
* @return Response
* @throws Exception
*/
public function show(UserGroup $userGroup): Response
{
return $this->render('user_group/show.html.twig', [
'userGroup' => $userGroup,
]);
}
/**
* Edit Frontend User Group
* @Route("/edit/{id}", name="user_group_edit", methods={"GET","POST"})
* @Security("is_granted('USER_GROUP_EDIT', userGroup) and is_granted('VIEW_PLAN_USER_GROUP',user)")
* @param Request $request
* @param TranslatorInterface $translator
* @param UserGroup $userGroup
* @return Response
* @throws Exception
*/
public function edit(Request $request, TranslatorInterface $translator, UserGroup $userGroup): Response
{
$editform = $this->createForm(UserGroupType::class, $userGroup, ['user' => $this->getUser(), 'action' => $this->generateUrl('user_group_edit', ['id' => $userGroup->getId()]), 'attr' => ['class' => 'ajax-form']]);
$originalTags = new ArrayCollection();
foreach ($userGroup->getUsers() as $tag) {
$originalTags->add($tag);
}
$editform->handleRequest($request);
if ($editform->isSubmitted()) {
/** Return Form with Errors if not validated else submit and send response **/
if (!$editform->isValid()) {
if ($request->isXmlHttpRequest()) {
$html = $this->renderView('user_group/edit-modal.html.twig', [
'user' => $userGroup,
'form' => $editform->createView(),
]);
return new Response($html, 400);
}
} else {
$em = $this->getDoctrine()->getManager();
foreach ($originalTags as $tag) {
/** If any user is Removed then remove the relational UserGroup **/
if (false === $userGroup->getUsers()->contains($tag)) {
$tag->getUserGroups()->removeElement($userGroup);
}
}
foreach ($userGroup->getUsers() as $user) {
$user->addUserGroup($userGroup);
}
$em->persist($userGroup);
$em->flush();
$data['status'] = 'success';
$data['msg'] = $translator->trans('msg.update_user_group');
return new JsonResponse(array('data' => $data));
}
}
return $this->render('user_group/edit-modal.html.twig', [
'user' => $userGroup,
'form' => $editform->createView(),
]);
}
/**
* Clone Frontend User Group
* @Route("/{id}/clone", name="user_group_clone", methods={"GET","POST"})
* @Security("is_granted('USER_GROUP_CLONE', userGroup) and is_granted('VIEW_PLAN_USER_GROUP',user)")
* @param Request $request
* @param TranslatorInterface $translator
* @param UserGroup $userGroup
* @return Response
* @throws Exception
*/
public function clone(Request $request, TranslatorInterface $translator, UserGroup $userGroup): Response
{
/** @var User $owner */
$owner = $this->getUser();
$newUserGroup = new UserGroup();
/** Copy All Data to New Group */
$newUserGroup->setGroupName($userGroup->getGroupName() . '-Clone');
foreach ($userGroup->getUsers() as $user) {
$newUserGroup->addUser($user);
$user->addUserGroup($userGroup);
}
if ($userGroup->getAdditionalInfo() != null) {
$newUserGroup->setAdditionalInfo($userGroup->getAdditionalInfo());
}
$newUserGroup->setWorkspace($owner->getWorkspace());
$newUserGroup->setPermission($userGroup->getPermission());
$newUserGroup->setCreatedBy($owner->getId());
$editform = $this->createForm(UserGroupType::class, $newUserGroup, ['user' => $this->getUser(), 'action' => $this->generateUrl('user_group_clone', ['id' => $userGroup->getId()]), 'attr' => ['class' => 'ajax-form']]);
$editform->handleRequest($request);
if ($editform->isSubmitted()) {
/** Return Form with Errors if not validated else submit and send response **/
if (!$editform->isValid()) {
if ($request->isXmlHttpRequest()) {
$html = $this->renderView('backend_group/edit-modal.html.twig', [
'user' => $newUserGroup,
'form' => $editform->createView(),
]);
return new Response($html, 400);
}
} else {
$em = $this->getDoctrine()->getManager();
foreach ($newUserGroup->getUsers() as $user) {
$user->addUserGroup($newUserGroup);
}
$em->persist($newUserGroup);
$em->flush();
$data['status'] = 'success';
$data['msg'] = $translator->trans('msg.clone_user_group');
return new JsonResponse(array('data' => $data));
}
}
return $this->render('user_group/clone.html.twig', [
'user' => $newUserGroup,
'form' => $editform->createView(),
]);
}
/**
* Delete Frontend User Group
* @Route("/delete/{id}", name="user_group_delete", methods={"POST"})
* @Security("is_granted('USER_GROUP_DELETE', userGroup) and is_granted('VIEW_PLAN_USER_GROUP',user)")
* @param Request $request
* @param TranslatorInterface $translator
* @param UserGroup $userGroup
* @return Response
* @throws Exception
*/
public function delete(Request $request, TranslatorInterface $translator, UserGroup $userGroup): Response
{
if (!$request->isXmlHttpRequest()) {
throw $this->createAccessDeniedException("Not an ajax request!");
}
if ($this->isCsrfTokenValid('delete' . $userGroup->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($userGroup);
$entityManager->flush();
}
$data['status'] = 'success';
$data['msg'] = $translator->trans('msg.delete_user_group');
return new JsonResponse(array('data' => $data));
}
/**
* Delete Bulk Frontend UserGroup
* @Route("/delete/usergroups", name="delete_usergroups", methods={"POST"})
* @Security("is_granted('USER_GROUP_MULTI_DELETE') and is_granted('VIEW_PLAN_USER_GROUP',user)")
* @param Request $request
* @return Response
* @throws Exception
*/
public function deleteUserGroups(Request $request): Response
{
if (!$request->isXmlHttpRequest()) {
throw $this->createAccessDeniedException("Not an ajax request!");
}
/** @var User $user */
$user = $this->getUser();
$data = explode(',', $request->request->get('data_ids'));
$em = $this->getDoctrine()->getManager();
foreach ($data as $id) {
$userGroup = $em->getRepository(UserGroup::class)->findOneBy(["id" => $id, "workspace" => $user->getWorkspace()->getId()]);
if (is_object($userGroup)){
$em->remove($userGroup);
}
}
$em->flush();
return new Response('success');
}
}