]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
remove tag from entry #1377
authorThomas Citharel <tcit@tcit.fr>
Wed, 10 Feb 2016 16:41:28 +0000 (17:41 +0100)
committerThomas Citharel <tcit@tcit.fr>
Wed, 10 Feb 2016 16:41:28 +0000 (17:41 +0100)
src/Wallabag/CoreBundle/Controller/TagController.php
src/Wallabag/CoreBundle/Entity/Tag.php
src/Wallabag/CoreBundle/Repository/TagRepository.php
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
src/Wallabag/CoreBundle/Tests/Controller/TagControllerTest.php

index ff4d64a8f4319653961310bbf5ba46d75a30c419..7b34939d2495847074fbf270f436ff6849d4580e 100644 (file)
@@ -55,6 +55,26 @@ class TagController extends Controller
         ));
     }
 
+    /**
+     * Removes tag from entry.
+     *
+     * @Route("/remove-tag/{entry}/{tag}", requirements={"entry" = "\d+", "tag" = "\d+"}, name="remove_tag")
+     *
+     * @return \Symfony\Component\HttpFoundation\Response
+     */
+    public function removeTagFromEntry(Request $request, Entry $entry, Tag $tag)
+    {
+        $entry->removeTag($tag);
+        $em = $this->getDoctrine()->getManager();
+        $em->flush();
+        if (count($tag->getEntries()) == 0) {
+            $em->remove($tag);
+        }
+        $em->flush();
+
+        return $this->redirect($request->headers->get('referer'));
+    }
+
     /**
      * Shows tags for current user.
      *
index c1940e99b29f4723196fc4f8665e2a9da68cf087..a6e2d023b8b008ef14da4ac396a917adab1f8820 100644 (file)
@@ -107,4 +107,14 @@ class Tag
     {
         return $this->entries->contains($entry);
     }
+
+    /**
+     * Get entries for this tag.
+     *
+     * @return ArrayCollection<Entry>
+     */
+    public function getEntries()
+    {
+        return $this->entries;
+    }
 }
index c4aeb5949f79fe76a69b8427300dfe625f283d4e..8d9cf85cef14677ff66077f8b057d62acc257257 100644 (file)
@@ -51,4 +51,20 @@ class TagRepository extends EntityRepository
             ->getQuery()
             ->getResult();
     }
+
+    /**
+     * Used only in test case to get a tag for our entry.
+     *
+     * @return Tag
+     */
+    public function findOnebyEntryAndLabel($entry, $label)
+    {
+        return $this->createQueryBuilder('t')
+            ->leftJoin('t.entries', 'e')
+            ->where('e.id = :entryId')->setParameter('entryId', $entry->getId())
+            ->andWhere('t.label = :label')->setParameter('label', $label)
+            ->setMaxResults(1)
+            ->getQuery()
+            ->getSingleResult();
+    }
 }
index 2d3fd5169f7d134a25d5fadfc43ef44f42f17e09..87af07dd6c936468f598838e040dbca72386e573 100644 (file)
@@ -159,7 +159,7 @@ main {
             <div id="list">
                 {% for tag in entry.tags %}
                     <div class="chip">
-                    {{ tag.label }}
+                    {{ tag.label }} <a href="{{ path('remove_tag', { 'entry': entry.id, 'tag': tag.id }) }}"><i class="chip">✘</i></a>
                     </div>
                 {% endfor %}
             </div>
index dc93dd6b8575a7b70ce9b66b99dd441c7d72913a..ae29a2a68383016de785d2957fee8b6c83dcae7a 100644 (file)
@@ -6,6 +6,8 @@ use Wallabag\CoreBundle\Tests\WallabagCoreTestCase;
 
 class TagControllerTest extends WallabagCoreTestCase
 {
+    public $tagName = 'opensource';
+
     public function testList()
     {
         $this->logInAs('admin');
@@ -31,7 +33,7 @@ class TagControllerTest extends WallabagCoreTestCase
         $form = $crawler->filter('button[id=tag_save]')->form();
 
         $data = array(
-            'tag[label]' => 'opensource',
+            'tag[label]' => $this->tagName,
         );
 
         $client->submit($form, $data);
@@ -65,4 +67,28 @@ class TagControllerTest extends WallabagCoreTestCase
 
         $this->assertEquals(2, count($newEntry->getTags()));
     }
+
+    public function testRemoveTagFromEntry()
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $entry = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->findOneByUsernameAndNotArchived('admin');
+
+        $tag = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Tag')
+            ->findOnebyEntryAndLabel($entry, $this->tagName);
+
+        $client->request('GET', '/remove-tag/'.$entry->getId().'/'.$tag->getId());
+
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+
+        $client->request('GET', '/remove-tag/'.$entry->getId().'/'.$tag->getId());
+
+        $this->assertEquals(404, $client->getResponse()->getStatusCode());
+    }
 }