From 4659d3621c6a52ca95a4d88681d581205e036295 Mon Sep 17 00:00:00 2001
From: Camille Simiand <camille.simiand@tetras-libre.fr>
Date: Fri, 11 Feb 2022 11:38:23 +0100
Subject: [PATCH] Add group all

---
 src/Builder/CapsuleBuilder.php          |  7 +++++
 src/Controller/CapsuleController.php    | 42 +++++++++++++++++++------
 src/DataFixtures/GroupFixtures.php      | 26 +++++++++++++++
 src/Entity/Group.php                    | 13 ++++++++
 templates/capsule/groups/edit.html.twig | 16 +++++-----
 templates/capsule/index.html.twig       | 15 ++++-----
 translations/messages.en.yaml           |  2 +-
 7 files changed, 96 insertions(+), 25 deletions(-)
 create mode 100644 src/DataFixtures/GroupFixtures.php

diff --git a/src/Builder/CapsuleBuilder.php b/src/Builder/CapsuleBuilder.php
index b219d3b..d3eda49 100755
--- a/src/Builder/CapsuleBuilder.php
+++ b/src/Builder/CapsuleBuilder.php
@@ -3,6 +3,7 @@
 namespace App\Builder;
 
 use App\Entity\Capsule;
+use App\Entity\Group;
 use App\Entity\User;
 use App\Helper\ContractHelper;
 
@@ -90,6 +91,12 @@ class CapsuleBuilder
         return $this;
     }
 
+    public function withGroup(Group $group): CapsuleBuilder
+    {
+        $this->capsule->addGroup($group);
+        return $this;
+    }
+
     public function createCapsule(): Capsule
     {
         $this->createEditionLink();
diff --git a/src/Controller/CapsuleController.php b/src/Controller/CapsuleController.php
index 0bf9c02..a1a8543 100755
--- a/src/Controller/CapsuleController.php
+++ b/src/Controller/CapsuleController.php
@@ -12,6 +12,8 @@ use App\Helper\StringHelper;
 use App\Repository\CapsuleRepository;
 use App\Builder\CapsuleBuilder;
 use App\Form\CreateCapsuleFormType;
+use App\Repository\GroupRepository;
+use Doctrine\ORM\EntityManagerInterface;
 use Knp\Component\Pager\PaginatorInterface;
 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 use Symfony\Component\Filesystem\Filesystem;
@@ -26,13 +28,19 @@ class CapsuleController extends AbstractController
 {
     private CapsuleRepository $capsule_repository;
     private TranslatorInterface $translator;
+    private GroupRepository $group_repository;
+    private EntityManagerInterface $entity_manager;
 
     public function __construct(
         CapsuleRepository $capsule_repository,
-        TranslatorInterface $translator
+        TranslatorInterface $translator,
+        GroupRepository $group_repository,
+        EntityManagerInterface $entity_manager
     ) {
         $this->capsule_repository = $capsule_repository;
         $this->translator = $translator;
+        $this->group_repository = $group_repository;
+        $this->entity_manager = $entity_manager;
     }
 
     /**
@@ -51,6 +59,11 @@ class CapsuleController extends AbstractController
 
         $all_capsules = $current_user->getCapsules();
 
+        $group_all = $this->getGroupAll();
+        $group_all->addCapsules($all_capsules->toArray());
+        $this->entity_manager->persist($group_all);
+        $this->entity_manager->flush();
+
         $form = $this->createForm(FilterByGroupFormType::class, ['groups' => $current_user->getGroups()]);
         $form->handleRequest($request);
 
@@ -175,8 +188,7 @@ class CapsuleController extends AbstractController
             return $this->redirectToRoute('app_logout');
         }
 
-        $entityManager = $this->getDoctrine()->getManager();
-        $capsule = $entityManager->getRepository(Capsule::class)->find($id);
+        $capsule = $this->capsule_repository->findOneBy(['id' => $id]);
 
         if (! $capsule) {
             throw $this->createNotFoundException(
@@ -202,8 +214,8 @@ class CapsuleController extends AbstractController
         if ($form->isSubmitted() && $form->isValid()) {
             $current_user->removeCapsule($capsule);
             $capsule->removeEditor($current_user);
-            $entityManager->remove($capsule);
-            $entityManager->flush();
+            $this->entity_manager->remove($capsule);
+            $this->entity_manager->flush();
 
             $this->addFlash(
                 'success',
@@ -240,8 +252,7 @@ class CapsuleController extends AbstractController
             return $this->redirectToRoute('app_logout');
         }
 
-        $entityManager = $this->getDoctrine()->getManager();
-        $parent_capsule = $entityManager->getRepository(Capsule::class)->find($id);
+        $parent_capsule = $this->capsule_repository->findOneBy(['id' => $id]);
 
         if (! $parent_capsule instanceof Capsule) {
             throw new \Exception('The retrieved capsule is not an instance of Capsule.');
@@ -301,7 +312,6 @@ class CapsuleController extends AbstractController
         $password = StringHelper::generateRandomHashedString();
         $preview_link = Uuid::v4();
 
-        $entityManager = $this->getDoctrine()->getManager();
         $capsule_builder = new CapsuleBuilder();
         $capsule = $capsule_builder
             ->withName($capsule_name)
@@ -310,11 +320,23 @@ class CapsuleController extends AbstractController
             ->withLinkPath($preview_link)
             ->withUpdateDate($new_date_time)
             ->withPassword($password)
+            ->withGroup($this->getGroupAll())
             ->createCapsule();
 
-        $entityManager->persist($capsule);
-        $entityManager->flush();
+        $this->entity_manager->persist($capsule);
+        $this->entity_manager->flush();
 
         return $capsule;
     }
+
+    private function getGroupAll(): Group
+    {
+        $group_all = $this->group_repository->findOneBy(['name' => "All"]);
+
+        if (! $group_all instanceof Group) {
+            throw new \Exception("Group not found");
+        }
+
+        return $group_all;
+    }
 }
diff --git a/src/DataFixtures/GroupFixtures.php b/src/DataFixtures/GroupFixtures.php
new file mode 100644
index 0000000..82cb667
--- /dev/null
+++ b/src/DataFixtures/GroupFixtures.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace App\DataFixtures;
+
+use App\Entity\Group;
+use Doctrine\Bundle\FixturesBundle\Fixture;
+use Doctrine\Persistence\ObjectManager;
+
+class GroupFixtures extends Fixture
+{
+    public function load(ObjectManager $manager): void
+    {
+        $group_all = new Group();
+        $group_all->setName("All");
+        $manager->persist($group_all);
+        $manager->flush();
+    }
+
+    /** @phpstan-ignore-next-line  */
+    public function getDependencies(): array
+    {
+        return [
+            CapsuleFixtures::class,
+        ];
+    }
+}
diff --git a/src/Entity/Group.php b/src/Entity/Group.php
index dae2d53..a8c2fd3 100755
--- a/src/Entity/Group.php
+++ b/src/Entity/Group.php
@@ -67,6 +67,19 @@ class Group
     {
         if (!$this->capsules->contains($capsule)) {
             $this->capsules[] = $capsule;
+            $capsule->addGroup($this);
+        }
+
+        return $this;
+    }
+
+    /**
+     * @param array<Capsule> $capsules
+     */
+    public function addCapsules(array $capsules): self
+    {
+        foreach ($capsules as $capsule) {
+            $this->addCapsule($capsule);
         }
 
         return $this;
diff --git a/templates/capsule/groups/edit.html.twig b/templates/capsule/groups/edit.html.twig
index 35070f4..6248ac5 100644
--- a/templates/capsule/groups/edit.html.twig
+++ b/templates/capsule/groups/edit.html.twig
@@ -38,13 +38,15 @@
                     </h5>
                     <ul class="ps-0">
                         {% for group in groups %}
-                            <li class="text-capitalize text-secondary list-unstyled p-1">
-                                {{ group.getName() }}
-                                -
-                                <a href="/capsule/{{ capsule.getId() }}/groups/{{ group.getId() }}/remove" class="remove-link">
-                                    {{ 'groups.remove.link'|trans }}
-                                </a>
-                            </li>
+                            {% if group.getName() != 'All' %}
+                                <li class="text-capitalize text-secondary list-unstyled p-1">
+                                    {{ group.getName() }}
+                                        -
+                                        <a href="/capsule/{{ capsule.getId() }}/groups/{{ group.getId() }}/remove" class="remove-link">
+                                            {{ 'groups.remove.link'|trans }}
+                                        </a>
+                                </li>
+                            {% endif %}
                         {% endfor %}
                     </ul>
                 </div>
diff --git a/templates/capsule/index.html.twig b/templates/capsule/index.html.twig
index f0bf7f2..b5413a1 100644
--- a/templates/capsule/index.html.twig
+++ b/templates/capsule/index.html.twig
@@ -13,13 +13,14 @@
                 {{ 'capsule.title'|trans }}
             </h2>
 
-            <div class="mb-3 mb-sm-0">
-                {{ form_start(filterByGroupForm, {'attr': {novalidate: 'novalidate', 'class': 'd-flex flex-column flex-sm-row mb-0 align-items-center pt-3'}}) }}
-                {{ form_row(filterByGroupForm.name, {'attr': {'class': ''}})  }}
-                {{ form_row(filterByGroupForm.filter, {'attr': {'class': 'ms-2'}})  }}
-                {{ form_end(filterByGroupForm) }}
-            </div>
-
+            {% if app.request.query.get('page')|default(1) == 1 %}
+                <div class="mb-3 mb-sm-0">
+                    {{ form_start(filterByGroupForm, {'attr': {novalidate: 'novalidate', 'class': 'd-flex flex-column flex-sm-row mb-0 align-items-center pt-3'}}) }}
+                    {{ form_row(filterByGroupForm.name, {'attr': {'class': ''}})  }}
+                    {{ form_row(filterByGroupForm.filter, {'attr': {'class': 'ms-2'}})  }}
+                    {{ form_end(filterByGroupForm) }}
+                </div>
+            {% endif %}
 
             <form class="d-flex mb-4 mb-lg-0">
                 <button id="btn-orange" formaction="/create">
diff --git a/translations/messages.en.yaml b/translations/messages.en.yaml
index 58e65a0..c41fd1e 100644
--- a/translations/messages.en.yaml
+++ b/translations/messages.en.yaml
@@ -181,4 +181,4 @@ groups:
     title: Remove group
     success: Group group_name removed successfully
   filter:
-    button: Filter by group
\ No newline at end of file
+    button: Apply group filter
\ No newline at end of file
-- 
GitLab