diff --git a/src/Controller/CapsuleGroupController.php b/src/Controller/CapsuleGroupController.php index 016ee13f6ef2fe1bace612396494e5d7a22307e2..a70c8ce6b21fe13a1e5f369a333e89df346fa75a 100755 --- a/src/Controller/CapsuleGroupController.php +++ b/src/Controller/CapsuleGroupController.php @@ -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(); + } + ); + } } diff --git a/src/Form/CreateCapsuleGroupsFormType.php b/src/Form/CreateCapsuleGroupsFormType.php index 1c03108ff6b6f186cbd4e331aa7c8ae4f80d1c3b..452885873246bc9cdeab9327a298b26e6b6ebb62 100755 --- a/src/Form/CreateCapsuleGroupsFormType.php +++ b/src/Form/CreateCapsuleGroupsFormType.php @@ -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; diff --git a/src/Form/SelectCapsuleGroupsFormType.php b/src/Form/SelectCapsuleGroupsFormType.php new file mode 100644 index 0000000000000000000000000000000000000000..91ef852542c1fb7b68ba71aafdb36d1da90d9d85 --- /dev/null +++ b/src/Form/SelectCapsuleGroupsFormType.php @@ -0,0 +1,34 @@ +<?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'] + ); + } +} diff --git a/templates/capsule/groups/create.html.twig b/templates/capsule/groups/create.html.twig index 3385001eb2ca13b7250b4db8713a47ae455637e9..c590d3a25987673defbb2b59eae384c421d504d9 100644 --- a/templates/capsule/groups/create.html.twig +++ b/templates/capsule/groups/create.html.twig @@ -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"> - {{ form_start(createCapsuleGroupsForm, {'attr': {novalidate: 'novalidate'}}) }} - {{ form_row(createCapsuleGroupsForm.name, {'row_attr': {'class' : 'm-auto mb-4'}}) }} - {{ form_row(createCapsuleGroupsForm.validate) }} + <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 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) }} + {{ form_row(createCapsuleGroupsForm.go_back) }} </a> - {{ form_end(createCapsuleGroupsForm) }} </div> -{# </div>#} + + {{ form_end(createCapsuleGroupsForm) }} + </div> + </div> {% endblock %} \ No newline at end of file diff --git a/templates/capsule/groups/edit.html.twig b/templates/capsule/groups/edit.html.twig index 75aadcd391e2e095c49fa4678865a11a4dd3e3fa..e1edb6b23f4947661287712e7c94595c8c2bff07 100644 --- a/templates/capsule/groups/edit.html.twig +++ b/templates/capsule/groups/edit.html.twig @@ -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> diff --git a/translations/messages.en.yaml b/translations/messages.en.yaml index 2f9093850e6aebe835c41c356bad46671f6f29ac..1addbf4a62e3f5530abcf7025c1f8946698fe430 100644 --- a/translations/messages.en.yaml +++ b/translations/messages.en.yaml @@ -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 diff --git a/translations/messages.fr.yaml b/translations/messages.fr.yaml index 7e4e87e4c7c8ce2de5925d3ec0b91f91a8254439..03014665d644ede827942435d4473db585b4ac64 100644 --- a/translations/messages.fr.yaml +++ b/translations/messages.fr.yaml @@ -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