Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 46 additions & 16 deletions app/src/Controller/GroupsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@
use App\Form\GroupsType;
use App\Service\GroupService;
use App\Service\UserService;
use App\Repository\UserRepository;
use App\Repository\GroupsRepository;
use App\Repository\GroupsWblistRepository;
use App\Repository\UserRepository;
use App\Repository\MailaddrRepository;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
Expand Down Expand Up @@ -41,13 +43,31 @@ private function checkAccess(Groups $group): void
}

#[Route(path: '/', name: 'groups_index', methods: 'GET')]
public function index(): Response
{
public function index(
Request $request,
GroupsRepository $groupsRepository,
PaginatorInterface $paginator
): Response {
/** @var User $user */
$user = $this->getUser();
$groups = $this->em
->getRepository(Groups::class)
->findByDomains($user->getDomains()->toArray());

$groupsQuery = $groupsRepository->getSearchQuery(
domains: $user->getDomains()->toArray(),
searchKey: $request->query->getString('search', '')
);

$perPage = (int) $this->getParameter('app.per_page_global');
$perPage = $request->getSession()->has('perPage') ? $request->getSession()->get('perPage') : $perPage;

$groups = $paginator->paginate(
$groupsQuery,
$request->query->getInt('page', 1),
$perPage,
[
'defaultSortFieldName' => 'g.name',
'defaultSortDirection' => 'asc',
]
);

return $this->render('groups/index.html.twig', ['groups' => $groups]);
}
Expand Down Expand Up @@ -199,6 +219,7 @@ public function removeUser(
GroupService $groupService,
UserRepository $userRepository,
): Response {

if ($this->isCsrfTokenValid('removeUser' . $user->getId(), $request->query->get('_token'))) {
$group->removeUser($user);

Expand Down Expand Up @@ -234,25 +255,34 @@ public function checkNameforDomain(string $name, Domain $domain): bool
}
}

#[Route(path: '/{id}/delete', name: 'groups_delete', methods: 'GET')]
#[Route(path: '/{id}/delete', name: 'groups_delete', methods: 'POST')]
public function delete(
Request $request,
Groups $group,
UserService $userService,
GroupService $groupService,
): Response {
if ($this->isCsrfTokenValid('delete' . $group->getId(), $request->query->get('_token'))) {
$groupUsers = $group->getUsers()->toArray();

$this->em->remove($group);
$this->em->flush();
$groupService->updateWblist();
foreach ($groupUsers as $user) {
$userService->updateUserAndAliasPolicy($user);
}
$this->em->flush();
$csrfToken = $request->request->getString('_token', '');

if (!$this->isCsrfTokenValid('delete' . $group->getId(), $csrfToken)) {
$this->addFlash('error', $this->translator->trans('Generics.flash.invalidCsrfToken'));
return $this->redirectToRoute('groups_index');
}

$groupUsers = $group->getUsers()->toArray();

$this->em->remove($group);
$this->em->flush();

$groupService->updateWblist();

foreach ($groupUsers as $user) {
$userService->updateUserAndAliasPolicy($user);
}

$this->em->flush();

return $this->redirectToRoute('groups_index');
}

Expand Down
20 changes: 13 additions & 7 deletions app/src/Repository/GroupsRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use App\Entity\Domain;
use App\Entity\Groups;
use App\Entity\User;
use Doctrine\ORM\Query;
use Doctrine\Persistence\ManagerRegistry;

/**
Expand Down Expand Up @@ -36,20 +37,25 @@ public function findOneByLdapDN(string $dn): ?Groups
}

/**
* Return the groups associated to one or more domains
* @param Domain[] $domains
* @return Groups[]
* @return Query<Groups>
*/
public function findByDomains(array $domains): array
public function getSearchQuery(array $domains, string $searchKey = ''): Query
{
$dql = $this->createQueryBuilder('g');
$queryBuilder = $this->createQueryBuilder('g')
->join('g.domain', 'd');

if ($domains) {
$dql->where('g.domain in (:domains)');
$dql->setParameter('domains', $domains);
$queryBuilder->where('g.domain in (:domains)');
$queryBuilder->setParameter('domains', $domains);
}

return $dql->getQuery()->getResult();
if ($searchKey !== '') {
$queryBuilder->andWhere('g.name LIKE :search OR d.domain LIKE :search')
->setParameter('search', '%' . $searchKey . '%');
}

return $queryBuilder->getQuery();
}

/**
Expand Down
171 changes: 102 additions & 69 deletions app/templates/groups/index.html.twig
Original file line number Diff line number Diff line change
@@ -1,80 +1,113 @@
{% extends 'base.html.twig' %}

{% block title %}{{ 'Entities.Group.Title'|trans() }}{% endblock %}
{% block title %}
{{ 'Entities.Group.Title'|trans() }}
{% endblock %}

{% block body %}
{% set _title = 'Entities.Group.Title'|trans %}
{% embed 'common/blockTitleAndButtons.html.twig' %}
{% set _title = 'Entities.Group.Title'|trans ~ ' : ' ~ groups.getTotalItemCount %}
{% embed 'common/blockTitleAndButtons.html.twig' %}

{% block content_button_actions %}
<a href="#" data-url-modal-content="{{ path('groups_new') }}" class="btn-open-modal btn btn-success float-right col-sm-12 col-md-4">
<i class="fas fa-plus"></i>&nbsp;{{ 'Entities.Group.Actions.New'|trans() }}</a>
{% endblock %}

{% block content_button_actions %}
<a href="#" data-url-modal-content="{{ path('groups_new') }}" class="btn-open-modal btn btn-success float-right col-sm-12 col-md-4"><i class="fas fa-plus"></i>&nbsp;{{ 'Entities.Group.Actions.New'|trans() }}</a>
{% endblock %}
{% endembed %}

{% endembed %}
<div class="col mb-3 bg-white pb-3">
<div class="row">
<div class="col-md-12">
{% include 'common/_rapidSearchForm.html.twig'%}
</div>
</div>
</div>


<div class="table-responsive">
<section id="no-more-tables">
<table id ="table_groups" class="table datatable hidden">
<thead>
<tr>
{# <th><input type="checkbox" id='checkAll'></th>#}
<th>{{ 'Entities.Group.Name'|trans() }}</th>
<th>{{ 'Entities.Domain.Name'|trans() }}</th>
<th>{{ 'Generics.fields.priority'|trans() }}</th>
<th>{{ 'Generics.fields.active'|trans() }}</th>
<th>{{ 'Entities.Group.Updated'|trans() }}</th>
<th>{{ 'Entities.Group.Actions.list'|trans() }}</th>
</tr>
</thead>
<tbody>
{% for group in groups %}
<tr>
{# <td><input type="checkbox"></td>#}
<td data-title="{{'Entities.Group.Name'|trans }}">{{group.name}}</td>
<td data-title="{{'Entities.Domain.Name'|trans }}">{{group.domain.domain}}</td>
<td data-title="{{'Generics.fields.priority'|trans }}">{{ group.priority }}</td>
<td data-title="{{'Generics.fields.active'|trans }}">{{ group.active ? 'Generics.labels.yes'|trans : 'Generics.labels.no'|trans }}</td>
<td data-title="{{'Entities.Group.Updated'|trans }}">{{group.datemod | format_datetime('short', 'short') }}</td>
<td>
<ul class="list-inline list-unstyled">
<li class="list-inline-item">
<a href="#" data-url-modal-content="{{ path('groups_edit',{'id':group.id}) }}" class='btn-open-modal btn btn-sm btn-success' data-target='authorized' title="{{ 'Entities.Group.Actions.updateGroup'|trans() }}">
<i class="fas fa-edit d-none d-md-block d-lg-none"></i>
<span class="d-md-none d-lg-block">{{ 'Entities.Group.Actions.Updated'|trans() }}</span>
</a>
</li>
<li class="list-inline-item">
<a href="{{ path('groups_wblist_index',{'groupId':group.id}) }}" class='btn btn-sm btn-dark ' data-target='authorized' title="{{ 'Entities.Group.labels.grouprules'|trans() }}">
<i class="fas fa-ruler d-none d-md-block d-lg-none"></i>
<span class="d-md-none d-lg-block">{{ 'Entities.Group.labels.rules'|trans() }}</span>
</a>
</li>
<li class="list-inline-item">
<a href="{{ path('groups_list_users',{'id':group.id}) }}" class='btn btn-sm btn-secondary' data-target='authorized' title="{{ 'Entities.Group.Actions.updateGroup'|trans() }}">
<i class="fas fa-edit d-none d-md-block d-lg-none"></i>
<span class="d-md-none d-lg-block">{{ 'Entities.Group.labels.usersGroup'|trans() }}</span>
</a>
</li>
<li class="list-inline-item">
<a href="{{ path('groups_delete',{'id' : group.id}) }}?_token={{ csrf_token('delete' ~ group.id) }}" class='btn btn-sm btn-danger confirmModal'
data-dialog-title='{{ 'Message.Dialogs.confirmDeleteGroupTitle'|trans }}'
data-dialog-content='{{ 'Message.Dialogs.confirmDeleteGroupContent'|trans }}'
title="{{ 'Entities.Group.Actions.Delete'|trans() }}">
<i class="fas fa-trash-alt d-none d-md-block d-lg-none"></i>
<span class="d-md-none d-lg-block">{{ 'Entities.Group.Actions.Delete'|trans() }}</span>
</a>
</li>
</ul>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</section>
</div>
{% include 'alertsPopup.html.twig' %}
<div class="table-responsive">
<section id="no-more-tables">
<table id="table_groups" class="table">
<thead>
<tr>
<th>{{ knp_pagination_sortable(groups, 'Entities.Group.Name'|trans(), 'g.name') }}</th>
<th>{{ knp_pagination_sortable(groups, 'Entities.Domain.Name'|trans(), 'd.domain') }}</th>
<th>{{ knp_pagination_sortable(groups, 'Generics.fields.priority'|trans(), 'g.priority') }}</th>
<th>{{ knp_pagination_sortable(groups, 'Generics.fields.active'|trans(), 'g.active') }}</th>
<th>{{ knp_pagination_sortable(groups, 'Entities.Group.Updated'|trans(), 'g.datemod') }}</th>
<th>{{ 'Entities.Group.Actions.list'|trans() }}</th>
</tr>
</thead>
<tbody>
{% for group in groups %}
<tr>
{# <td><input type="checkbox"></td>#}
<td data-title="{{'Entities.Group.Name'|trans }}">{{group.name}}</td>
<td data-title="{{'Entities.Domain.Name'|trans }}">{{group.domain.domain}}</td>
<td data-title="{{'Generics.fields.priority'|trans }}">{{ group.priority }}</td>
<td data-title="{{'Generics.fields.active'|trans }}">{{ group.active ? 'Generics.labels.yes'|trans : 'Generics.labels.no'|trans }}</td>
<td data-title="{{'Entities.Group.Updated'|trans }}">{{group.datemod | format_datetime('short', 'short') }}</td>
<td>
<ul class="list-inline list-unstyled">
<li class="list-inline-item">
<a
href="#"
data-url-modal-content="{{ path('groups_edit',{'id':group.id}) }}"
class='btn-open-modal btn btn-sm btn-success'
data-target='authorized'
title="{{ 'Entities.Group.Actions.updateGroup'|trans() }}"
>
<i class="fas fa-edit d-none d-md-block d-lg-none"></i>
<span class="d-md-none d-lg-block">{{ 'Entities.Group.Actions.Updated'|trans() }}</span>
</a>
</li>
<li class="list-inline-item">
<a
href="{{ path('groups_wblist_index',{'groupId':group.id}) }}"
class='btn btn-sm btn-dark '
data-target='authorized'
title="{{ 'Entities.Group.labels.grouprules'|trans() }}"
>
<i class="fas fa-ruler d-none d-md-block d-lg-none"></i>
<span class="d-md-none d-lg-block">{{ 'Entities.Group.labels.rules'|trans() }}</span>
</a>
</li>
<li class="list-inline-item">
<a
href="{{ path('groups_list_users',{'id':group.id}) }}"
class='btn btn-sm btn-secondary'
data-target='authorized'
title="{{ 'Entities.Group.Actions.updateGroup'|trans() }}"
>
<i class="fas fa-edit d-none d-md-block d-lg-none"></i>
<span class="d-md-none d-lg-block">{{ 'Entities.Group.labels.usersGroup'|trans() }}</span>
</a>
</li>
<li class="list-inline-item">
<form
method="post"
class="d-inline"
action="{{ path('groups_delete', {'id': group.id}) }}"
data-turbo-confirm="{{ 'Message.Dialogs.confirmDeleteGroupContent'|trans }}"
>
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ group.id) }}">
<button type="submit" class="btn btn-sm btn-danger">
<i class="fas fa-trash-alt d-xsd-sm-block d-sm-block d-md-block d-lg-none"></i>
<span class="d-none d-lg-block">
{{ 'Entities.Group.Actions.Delete'|trans() }}
</span>
</button>
</form>

</li>
</ul>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</section>
</div>
{% include 'common/_paginationAndPerPageSelector.html.twig' with { 'pagination': groups } %}
{% include 'alertsPopup.html.twig' %}


{% endblock %}
2 changes: 1 addition & 1 deletion app/translations/messages+intl-icu.en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ Entities.Group.Actions.editRuleGroup: 'Edit the group rule'
Entities.Group.Actions.list: Actions
Entities.Group.Actions.updateGroup: 'Modify the group'
Entities.Group.Name: Name
Entities.Group.Title: 'Managing groups'
Entities.Group.Title: 'List of groups'
Entities.Group.Updated: Update
Entities.Group.fields.domain: 'Associated domain'
Entities.Group.fields.name: 'Group name'
Expand Down
2 changes: 1 addition & 1 deletion app/translations/messages+intl-icu.fr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ Entities.Group.Actions.editRuleGroup: 'Modifier la règle du groupe'
Entities.Group.Actions.list: Actions
Entities.Group.Actions.updateGroup: 'Modifier le groupe'
Entities.Group.Name: Nom
Entities.Group.Title: 'Gérer les groupes'
Entities.Group.Title: 'Liste les groupes'
Entities.Group.Updated: 'Mise à jour'
Entities.Group.fields.domain: 'Domaine associé'
Entities.Group.fields.name: 'Nom du groupe'
Expand Down
Loading