Skip to content
Snippets Groups Projects
Commit 7fb79362 authored by Camille Simiand's avatar Camille Simiand
Browse files

Add existing group to capsule

parent fb578212
No related branches found
No related tags found
2 merge requests!55demo version for Clarisse workshop,!51tuleap-130-add-a-capsule-into-custom-groups
......@@ -6,9 +6,13 @@ use App\Entity\Capsule;
use App\Entity\Group;
use App\Entity\User;
use App\Form\CreateCapsuleGroupsFormType;
use App\Form\SelectCapsuleGroupsFormType;
use App\Repository\CapsuleRepository;
use App\Repository\GroupRepository;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Contracts\Translation\TranslatorInterface;
......@@ -19,15 +23,18 @@ class CapsuleGroupController extends AbstractController
private TranslatorInterface $translator;
private CapsuleRepository $capsule_repository;
private EntityManagerInterface $entity_manager;
private GroupRepository $group_repository;
public function __construct(
TranslatorInterface $translator,
CapsuleRepository $capsule_repository,
EntityManagerInterface $entity_manager
EntityManagerInterface $entity_manager,
GroupRepository $group_repository
) {
$this->translator = $translator;
$this->capsule_repository = $capsule_repository;
$this->entity_manager = $entity_manager;
$this->group_repository = $group_repository;
}
/**
......@@ -41,9 +48,6 @@ class CapsuleGroupController extends AbstractController
return $this->redirectToRoute('app_logout');
}
$form = $this->createForm(CreateCapsuleGroupsFormType::class);
$form->handleRequest($request);
$capsule = $this->capsule_repository->findOneBy(['id' => $capsule_id]);
if (! $capsule instanceof Capsule) {
......@@ -51,26 +55,30 @@ class CapsuleGroupController extends AbstractController
}
$groups = $capsule->getGroups();
$editor_groups_not_added = $this->getEditorGroupsNotAdded($current_user, $groups);
$form = $this->createForm(SelectCapsuleGroupsFormType::class, ['groups' => $editor_groups_not_added]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $group_name = $form->get('name')->getData();
// $group = new Group();
// $group->setName($group_name);
// $this->entity_manager->persist($group);
// $capsule->addGroup($group);
// $this->entity_manager->persist($capsule);
// $this->entity_manager->flush();
//
// $this->addFlash(
// 'success',
// $this->translator->trans(
// 'groups.add.success',
// [
// 'group_name' => $group->getName(),
// 'capsule_name' => $capsule->getName()
// ]
// )
// );
$groups = $this->addGroups($form, $capsule);
$groups_names = [];
foreach ($groups as $group) {
$groups_names[] = $group->getName();
}
$this->addFlash(
'success',
$this->translator->trans(
'groups.add.success',
[
'groups_names' => implode(",", $groups_names),
'capsule_name' => $capsule->getName()
]
)
);
return $this->redirectToRoute('edit_capsule_groups', [
'capsule_id' => $capsule_id
......@@ -78,9 +86,10 @@ class CapsuleGroupController extends AbstractController
}
return $this->render('capsule/groups/edit.html.twig', [
'editCapsuleGroupsForm' => $form->createView(),
'selectCapsuleGroupsForm' => $form->createView(),
'capsule' => $capsule,
'groups' => $groups
'groups' => $groups,
'existing_groups' => $editor_groups_not_added
]);
}
......@@ -95,21 +104,17 @@ class CapsuleGroupController extends AbstractController
return $this->redirectToRoute('app_logout');
}
$form = $this->createForm(CreateCapsuleGroupsFormType::class);
$form->handleRequest($request);
$capsule = $this->capsule_repository->findOneBy(['id' => $capsule_id]);
if (! $capsule instanceof Capsule) {
throw new \Exception("Capsule does not exist");
}
$form = $this->createForm(CreateCapsuleGroupsFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$group_name = $form->get('name')->getData();
$group = new Group();
$group->setName($group_name);
$this->entity_manager->persist($group);
$this->entity_manager->flush();
$group = $this->createAGroup($form, $capsule);
$this->addFlash(
'success',
......@@ -131,4 +136,79 @@ class CapsuleGroupController extends AbstractController
'capsule' => $capsule
]);
}
/**
* @return array<Group>
*/
private function addGroups(FormInterface $form, Capsule $capsule): array
{
$groups_data = $form->getData()['name'];
$groups = [];
foreach ($groups_data as $group_data) {
$group_db = $this->group_repository->findOneBy(['id' => $group_data->getId()]);
if (! $group_db instanceof Group) {
throw new \Exception('Group not found');
}
$groups[] = $group_db;
$capsule->addGroup($group_db);
$this->entity_manager->persist($capsule);
}
$this->entity_manager->flush();
return $groups;
}
private function createAGroup(FormInterface $form, Capsule $capsule): Group
{
$group_name = $form->get('name')->getData();
$group = new Group();
$group->setName($group_name);
$this->entity_manager->persist($group);
$capsule->addGroup($group);
$this->entity_manager->persist($capsule);
$this->entity_manager->flush();
return $group;
}
/**
* @return array<Group>
*/
private function getExistingGroupsForCurrentEditor(User $current_user): array
{
$editor_capsules = $current_user->getCapsules();
$existing_groups_for_current_editor = [];
foreach ($editor_capsules as $editor_capsule) {
$existing_groups_for_current_editor = array_merge(
$existing_groups_for_current_editor,
$editor_capsule->getGroups()->toArray()
);
}
return $existing_groups_for_current_editor;
}
/**
* @param Collection<Group> $groups
* @return array<Group>
*/
private function getEditorGroupsNotAdded(User $current_user, Collection $groups): array
{
$editor_existing_groups = $this->getExistingGroupsForCurrentEditor($current_user);
return array_udiff(
$editor_existing_groups,
$groups->toArray(),
function ($obj_a, $obj_b) {
return $obj_a->getId() - $obj_b->getId();
}
);
}
}
......@@ -2,7 +2,6 @@
namespace App\Form;
use App\Entity\Capsule;
use App\Entity\Group;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
......
<?php
namespace App\Form;
use App\Entity\Group;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\FormBuilderInterface;
class SelectCapsuleGroupsFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$groups = $options['data']['groups'];
$builder
->add('name', EntityType::class, [
'class' => Group::class,
'choice_label' => 'name',
'choices' => $groups,
'multiple' => true,
'label' => 'groups.choose',
'choice_value' => function (?Group $entity) {
return $entity ? $entity->getId() : '';
}
])
->add(
'validate',
SubmitType::class,
['label' => 'groups.add.validate']
);
}
}
......@@ -17,17 +17,20 @@
</div>
</div>
{# <div class="d-flex flex-md-row flex-column justify-content-center">#}
<div class="d-flex flex-column justify-content-center ms-md-5 ms-0 order-md-2 mb-4 col-sm-8 col-md-6 col-lg-5 col-xl-4">
<div class="d-flex flex-column justify-content-center align-items-center">
{{ form_start(createCapsuleGroupsForm, {'attr': {novalidate: 'novalidate'}}) }}
{{ form_row(createCapsuleGroupsForm.name, {'row_attr': {'class' : 'm-auto mb-4'}}) }}
{{ form_row(createCapsuleGroupsForm.validate) }}
{{ form_row(createCapsuleGroupsForm.name, {'row_attr': {'class' : 'm-auto mb-4 me-3'}}) }}
<div class="d-flex flex-column flex-sm-row justify-content-center align-items-center align-items-sm-start">
{{ form_row(createCapsuleGroupsForm.validate, {'row_attr': {'class' : 'me-sm-3 mb-3'}}) }}
<a href="/capsule/{{ capsule.getId() }}/groups/edit">
{{ form_row(createCapsuleGroupsForm.go_back) }}
</a>
</div>
{{ form_end(createCapsuleGroupsForm) }}
</div>
{# </div>#}
</div>
{% endblock %}
\ No newline at end of file
......@@ -30,29 +30,6 @@
{% endfor %}
<div class="d-flex flex-md-row flex-column justify-content-center">
{# <div class="d-flex flex-column justify-content-center ms-md-5 ms-0 order-md-2 mb-4 col-sm-8 col-md-6 col-lg-5 col-xl-4">#}
{# {{ form_start(addCapsuleGroupsForm, {'attr': {novalidate: 'novalidate'}}) }}#}
{# {{ form_row(addCapsuleGroupsForm.name, {'row_attr': {'class' : 'm-auto mb-4'}}) }}#}
{# {{ form_row(addCapsuleGroupsForm.validate) }}#}
{# {{ form_end(addCapsuleGroupsForm) }}#}
{# </div>#}
{# <select class="form-select" multiple aria-label="multiple select example">#}
{# {% for existing_group in existing_groups %}#}
{# <option selected>{{ existing_group->getName() }}</option>#}
{# <option value="1">One</option>#}
{# </select>#}
<a href="/capsule/{{ capsule.getId() }}/groups/create">
Add a new group
</a>
{# <div class="d-flex flex-column justify-content-center ms-md-5 ms-0 order-md-2 mb-4 col-sm-8 col-md-6 col-lg-5 col-xl-4">#}
{# {{ form_start(createCapsuleGroupsForm, {'attr': {novalidate: 'novalidate'}}) }}#}
{# {{ form_row(createCapsuleGroupsForm.name, {'row_attr': {'class' : 'm-auto mb-4'}}) }}#}
{# {{ form_row(createCapsuleGroupsForm.validate) }}#}
{# {{ form_end(createCapsuleGroupsForm) }}#}
{# </div>#}
<div class="d-flex flex-row pe-md-5 pb-3 fw-normal me-0 me-md-5">
<div class="pe-3 pe-md-4 text-nowrap">
......@@ -69,6 +46,23 @@
</div>
</div>
<div class="d-flex flex-column justify-content-center order-md-2 mb-4 col-sm-8 col-md-6 col-lg-5 col-xl-4">
<h5 class="mb-5">
<a href="/capsule/{{ capsule.getId() }}/groups/create" class="list-unstyled">
{{ 'groups.create.title'|trans }}
</a>
</h5>
{% if existing_groups is not empty %}
<div class="d-flex flex-column justify-content-center mb-4">
{{ form_start(selectCapsuleGroupsForm, {'attr': {novalidate: 'novalidate'}}) }}
{{ form_row(selectCapsuleGroupsForm.name, {'row_attr': {'class' : 'm-auto mb-4'}}) }}
{{ form_row(selectCapsuleGroupsForm.validate) }}
{{ form_end(selectCapsuleGroupsForm) }}
</div>
{% endif %}
</div>
</div>
</div>
......
......@@ -142,6 +142,21 @@ editors:
text: You have been add by %user_name% as editor of the capsule "%capsule_name%".
You can now access and edit it. You will find the capsule in your capsule list.
link: Go to capsule edition page
remove:
button: Delete
pending_editor:
title: Remove pending editor
text: Do you really want to remove pending editor %editor_email% ?
link: Remove pending editor
error: Email address pending_editor_email has already been removed from the pending editors list of the capsule capsule_name
success: Email address pending_editor_email has been successfully removed from the pending editor list of the capsule capsule_name
editor:
title: Remove editor
text: Do you really want to remove editor %editor_email% ?
link: Remove editor
success: User editor_email cannot edit anymore the capsule capsule_name
error: You can't remove yourself as editor of your own capsule.
If you want to remove the capsule from your list, go to the capsule list page and click on "delete capsule"
groups:
list:
......@@ -151,9 +166,11 @@ groups:
title_with_capsule_name: Groups for capsule %capsule_name%
create:
title: Create a new group
success: Group group_name has been created successfully
success: Group group_name has been created and added to the capsule successfully
name: Choose a new group name
validate: Create a new group
go_back: Go back to capsule groups
add:
success: Group group_name has been added successfully to capsule capsule_name
\ No newline at end of file
success: Group(s) groups_names has/have been added successfully to capsule capsule_name
validate: Add theses groups to the capsule
choose: Please choose one or more groups
\ No newline at end of file
......@@ -154,8 +154,8 @@ editors:
text: Souhaitez-vous vraiment supprimer l'éditeur %editor_email% ?
link: Supprimer l'éditeur
success: L'utilisateur editor_email ne peut plus éditer la capsule capsule_name
error: You can't remove yourself as editor of your own capsule.
If you want to remove the capsule from your list, go to the capsule list page and click on "delete capsule"
error: Vous ne pouvez pas vous enlever de la liste des éditeurs de votre propre capsule.
Si vous voulez enlever la capsule de votre liste, allez sur la page qui affiche la liste de vos capsules et cliquer sur "supprimer la capsule"
groups:
list:
......@@ -165,9 +165,11 @@ groups:
title_with_capsule_name: Groupes de la capsule %capsule_name%
create:
title: Créer un nouveau groupe
success: Le groupe group_name a bien été créé
success: Le groupe group_name a bien été créé et ajouté à la capsule
name: Choisir un nom de groupe
validate: Créer un nouveau groupe
go_back: Retourner à la liste des groupes
add:
success: Le groupe group_name a bien été ajouté à la capsule capsule_name
\ No newline at end of file
success: Le(s) groupe(s) groups_names a/ont bien été ajouté(s) à la capsule capsule_name
validate: Ajouter ces groupes à la capsule
choose: Veuillez choisir un ou plusieurs groupes
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment