diff options
author | Jeremy Benoist <jeremy.benoist@gmail.com> | 2016-10-09 18:41:19 +0200 |
---|---|---|
committer | Jeremy Benoist <jeremy.benoist@gmail.com> | 2016-10-09 18:55:22 +0200 |
commit | 28bb48905a2104adad65508f51737f987dc1ad4c (patch) | |
tree | 41922f46efae593fc786b561486a40ee70e25383 /src | |
parent | b4fcd60e7f217bf0b23fa99c83698e7407bee54b (diff) | |
download | wallabag-28bb48905a2104adad65508f51737f987dc1ad4c.tar.gz wallabag-28bb48905a2104adad65508f51737f987dc1ad4c.tar.zst wallabag-28bb48905a2104adad65508f51737f987dc1ad4c.zip |
Optimize the way tag list is rendered
Instead of retrieve all informations about entries of a tag to just count them, we’ll count them before with a fastest query.
Also change the layout of the tag list in material design
Diffstat (limited to 'src')
6 files changed, 58 insertions, 12 deletions
diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php index ed31c536..9997913d 100644 --- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php +++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php | |||
@@ -387,7 +387,7 @@ class WallabagRestController extends FOSRestController | |||
387 | 387 | ||
388 | $tags = $this->getDoctrine() | 388 | $tags = $this->getDoctrine() |
389 | ->getRepository('WallabagCoreBundle:Tag') | 389 | ->getRepository('WallabagCoreBundle:Tag') |
390 | ->findAllTagsWithEntries($this->getUser()->getId()); | 390 | ->findAllTags($this->getUser()->getId()); |
391 | 391 | ||
392 | $json = $this->get('serializer')->serialize($tags, 'json'); | 392 | $json = $this->get('serializer')->serialize($tags, 'json'); |
393 | 393 | ||
diff --git a/src/Wallabag/CoreBundle/Controller/TagController.php b/src/Wallabag/CoreBundle/Controller/TagController.php index c5746734..5acc6852 100644 --- a/src/Wallabag/CoreBundle/Controller/TagController.php +++ b/src/Wallabag/CoreBundle/Controller/TagController.php | |||
@@ -86,10 +86,25 @@ class TagController extends Controller | |||
86 | { | 86 | { |
87 | $tags = $this->getDoctrine() | 87 | $tags = $this->getDoctrine() |
88 | ->getRepository('WallabagCoreBundle:Tag') | 88 | ->getRepository('WallabagCoreBundle:Tag') |
89 | ->findAllTagsWithEntries($this->getUser()->getId()); | 89 | ->findAllTags($this->getUser()->getId()); |
90 | |||
91 | $flatTags = []; | ||
92 | |||
93 | foreach ($tags as $key => $tag) { | ||
94 | $nbEntries = $this->getDoctrine() | ||
95 | ->getRepository('WallabagCoreBundle:Entry') | ||
96 | ->countAllEntriesByUserIdAndTagId($this->getUser()->getId(), $tag['id']); | ||
97 | |||
98 | $flatTags[] = [ | ||
99 | 'id' => $tag['id'], | ||
100 | 'label' => $tag['label'], | ||
101 | 'slug' => $tag['slug'], | ||
102 | 'nbEntries' => $nbEntries, | ||
103 | ]; | ||
104 | } | ||
90 | 105 | ||
91 | return $this->render('WallabagCoreBundle:Tag:tags.html.twig', [ | 106 | return $this->render('WallabagCoreBundle:Tag:tags.html.twig', [ |
92 | 'tags' => $tags, | 107 | 'tags' => $flatTags, |
93 | ]); | 108 | ]); |
94 | } | 109 | } |
95 | 110 | ||
diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php index 75127b7d..cd2b47b9 100644 --- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php +++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php | |||
@@ -309,4 +309,24 @@ class EntryRepository extends EntityRepository | |||
309 | 309 | ||
310 | return $qb->getQuery()->getSingleScalarResult(); | 310 | return $qb->getQuery()->getSingleScalarResult(); |
311 | } | 311 | } |
312 | |||
313 | /** | ||
314 | * Count all entries for a tag and a user. | ||
315 | * | ||
316 | * @param int $userId | ||
317 | * @param int $tagId | ||
318 | * | ||
319 | * @return int | ||
320 | */ | ||
321 | public function countAllEntriesByUserIdAndTagId($userId, $tagId) | ||
322 | { | ||
323 | $qb = $this->createQueryBuilder('e') | ||
324 | ->select('count(e.id)') | ||
325 | ->leftJoin('e.tags', 't') | ||
326 | ->where('e.user=:userId')->setParameter('userId', $userId) | ||
327 | ->andWhere('t.id=:tagId')->setParameter('tagId', $tagId) | ||
328 | ; | ||
329 | |||
330 | return $qb->getQuery()->getSingleScalarResult(); | ||
331 | } | ||
312 | } | 332 | } |
diff --git a/src/Wallabag/CoreBundle/Repository/TagRepository.php b/src/Wallabag/CoreBundle/Repository/TagRepository.php index 9d127da7..e76878d4 100644 --- a/src/Wallabag/CoreBundle/Repository/TagRepository.php +++ b/src/Wallabag/CoreBundle/Repository/TagRepository.php | |||
@@ -33,19 +33,23 @@ class TagRepository extends EntityRepository | |||
33 | } | 33 | } |
34 | 34 | ||
35 | /** | 35 | /** |
36 | * Find all tags with associated entries per user. | 36 | * Find all tags per user. |
37 | * | 37 | * |
38 | * @param int $userId | 38 | * @param int $userId |
39 | * | 39 | * |
40 | * @return array | 40 | * @return array |
41 | */ | 41 | */ |
42 | public function findAllTagsWithEntries($userId) | 42 | public function findAllTags($userId) |
43 | { | 43 | { |
44 | return $this->createQueryBuilder('t') | 44 | return $this->createQueryBuilder('t') |
45 | ->select('t.slug', 't.label', 't.id') | ||
45 | ->leftJoin('t.entries', 'e') | 46 | ->leftJoin('t.entries', 'e') |
46 | ->where('e.user = :userId')->setParameter('userId', $userId) | 47 | ->where('e.user = :userId')->setParameter('userId', $userId) |
48 | ->groupBy('t.slug') | ||
49 | ->addGroupBy('t.label') | ||
50 | ->addGroupBy('t.id') | ||
47 | ->getQuery() | 51 | ->getQuery() |
48 | ->getResult(); | 52 | ->getArrayResult(); |
49 | } | 53 | } |
50 | 54 | ||
51 | /** | 55 | /** |
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Tag/tags.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Tag/tags.html.twig index 50043907..1e2c6b42 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Tag/tags.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Tag/tags.html.twig | |||
@@ -9,7 +9,7 @@ | |||
9 | 9 | ||
10 | <ul> | 10 | <ul> |
11 | {% for tag in tags %} | 11 | {% for tag in tags %} |
12 | <li id="tag-{{ tag.id|e }}"><a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{tag.label}} ({{ tag.entries.getValues | length }})</a></li> | 12 | <li id="tag-{{ tag.id|e }}"><a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{tag.label}} ({{ tag.nbEntries | length }})</a></li> |
13 | {% endfor %} | 13 | {% endfor %} |
14 | </ul> | 14 | </ul> |
15 | 15 | ||
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig index 1690633a..96f4f990 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Tag/tags.html.twig | |||
@@ -6,12 +6,19 @@ | |||
6 | <div class="results clearfix"> | 6 | <div class="results clearfix"> |
7 | <div class="nb-results left">{{ 'tag.list.number_on_the_page'|transchoice(tags|length) }}</div> | 7 | <div class="nb-results left">{{ 'tag.list.number_on_the_page'|transchoice(tags|length) }}</div> |
8 | </div> | 8 | </div> |
9 | |||
9 | <br /> | 10 | <br /> |
10 | <ul class="row data"> | 11 | |
11 | {% for tag in tags %} | 12 | <div class="row"> |
12 | <li id="tag-{{ tag.id|e }}" class="col l4 m6 s12"><a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{tag.label}} ({{ tag.entries.getValues | length }})</a></li> | 13 | <ul class="card-tag-labels"> |
13 | {% endfor %} | 14 | {% for tag in tags %} |
14 | </ul> | 15 | <li title="{{tag.label}} ({{ tag.nbEntries }})" id="tag-{{ tag.id }}" class="col l2 m2 s2"> |
16 | <a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{tag.label}} ({{ tag.nbEntries }})</a> | ||
17 | </li> | ||
18 | {% endfor %} | ||
19 | </ul> | ||
20 | </div> | ||
21 | |||
15 | <div> | 22 | <div> |
16 | <a href="{{ path('untagged') }}">{{ 'tag.list.see_untagged_entries'|trans }}</a> | 23 | <a href="{{ path('untagged') }}">{{ 'tag.list.see_untagged_entries'|trans }}</a> |
17 | </div> | 24 | </div> |