support multiple teamleads in each team (#2702)

* fix jumping avatars
* fix line-break after color dot for long names
This commit is contained in:
Kevin Papst
2021-08-07 18:05:41 +02:00
committed by GitHub
parent e9986c92d6
commit b2d3272151
101 changed files with 1952 additions and 649 deletions

View File

@@ -11,9 +11,9 @@ namespace App\Repository;
use App\Entity\Invoice;
use App\Entity\Role;
use App\Entity\Team;
use App\Entity\Timesheet;
use App\Entity\User;
use App\Repository\Loader\UserIdLoader;
use App\Repository\Loader\UserLoader;
use App\Repository\Paginator\LoaderPaginator;
use App\Repository\Paginator\PaginatorInterface;
@@ -59,11 +59,11 @@ class UserRepository extends EntityRepository implements UserLoaderInterface
public function getUserById($id): ?User
{
/** @var User|null $user */
$user = $this->findOneBy(['id' => $id]);
$user = $this->find($id);
if ($user !== null) {
$loader = new UserIdLoader($this->getEntityManager());
$loader->loadResults([$user->getId()]);
$loader = new UserLoader($this->getEntityManager(), true);
$loader->loadResults([$user]);
}
return $user;
@@ -82,11 +82,7 @@ class UserRepository extends EntityRepository implements UserLoaderInterface
return parent::findOneBy($criteria, $orderBy);
}
/**
* @param null|bool $enabled
* @return int
*/
public function countUser($enabled = null)
public function countUser(?bool $enabled = null): int
{
if (null !== $enabled) {
return $this->count(['enabled' => (bool) $enabled]);
@@ -135,8 +131,8 @@ class UserRepository extends EntityRepository implements UserLoaderInterface
->getOneOrNullResult();
if ($user !== null) {
$loader = new UserIdLoader($this->getEntityManager());
$loader->loadResults([$user->getId()]);
$loader = new UserLoader($this->getEntityManager(), true);
$loader->loadResults([$user]);
}
return $user;
@@ -178,6 +174,11 @@ class UserRepository extends EntityRepository implements UserLoaderInterface
return $qb;
}
/**
* @param QueryBuilder $qb
* @param User|null $user
* @param Team[] $teams
*/
private function addPermissionCriteria(QueryBuilder $qb, ?User $user = null, array $teams = [])
{
// make sure that all queries without a user see all user
@@ -193,23 +194,38 @@ class UserRepository extends EntityRepository implements UserLoaderInterface
$or = $qb->expr()->orX();
// if no explicit team was requested and the user is part of some teams
// then find all members of teams where he is teamlead
if (null !== $user && $user->hasTeamAssignment()) {
$qb->leftJoin('u.teams', 't');
$or->add($qb->expr()->eq('t.teamlead', ':teamlead'));
$qb->setParameter('teamlead', $user);
// then find all members of his teams (where he is teamlead)
if (null !== $user && $user->isTeamlead()) {
$userIds = [];
foreach ($user->getTeams() as $team) {
if ($team->isTeamlead($user)) {
foreach ($team->getUsers() as $teamMember) {
$userIds[] = $teamMember->getId();
}
}
}
$userIds = array_unique($userIds);
$qb->setParameter('teamMember', $userIds);
$or->add($qb->expr()->in('u.id', ':teamMember'));
}
// if teams where requested, then select all team members
if (\count($teams) > 0) {
$or->add($qb->expr()->isMemberOf(':teams', 'u.teams'));
$qb->setParameter('teams', $teams);
$userIds = [];
foreach ($teams as $team) {
foreach ($team->getUsers() as $user) {
$userIds[] = $user->getId();
}
}
$userIds = array_unique($userIds);
$qb->setParameter('userIds', $userIds);
$or->add($qb->expr()->in('u.id', ':userIds'));
}
// and make sure, that the user himself is always returned
if (null !== $user) {
$or->add($qb->expr()->eq('u.id', ':user'));
$qb->setParameter('user', $user);
$or->add($qb->expr()->eq('u.id', ':self'));
$qb->setParameter('self', $user);
}
if ($or->count() > 0) {
@@ -251,6 +267,17 @@ class UserRepository extends EntityRepository implements UserLoaderInterface
$this->addPermissionCriteria($qb, $query->getCurrentUser(), $query->getTeams());
if (\count($query->getSearchTeams()) > 0) {
$userIds = [];
foreach ($query->getSearchTeams() as $team) {
foreach ($team->getUsers() as $user) {
$userIds[] = $user->getId();
}
}
$qb->andWhere($qb->expr()->in('u.id', ':searchTeams'));
$qb->setParameter('searchTeams', array_unique($userIds));
}
if ($query->isShowVisible()) {
$qb->andWhere($qb->expr()->eq('u.enabled', ':enabled'));
$qb->setParameter('enabled', true, \PDO::PARAM_BOOL);