aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Wallabag/CoreBundle
diff options
context:
space:
mode:
Diffstat (limited to 'src/Wallabag/CoreBundle')
-rw-r--r--src/Wallabag/CoreBundle/Controller/EntryController.php89
-rw-r--r--src/Wallabag/CoreBundle/Controller/ExportController.php2
-rw-r--r--src/Wallabag/CoreBundle/Entity/Entry.php18
-rw-r--r--src/Wallabag/CoreBundle/Form/Type/EditGroupSharesType.php43
-rw-r--r--src/Wallabag/CoreBundle/Repository/EntryRepository.php13
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.en.yml26
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml27
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/_share_groups.html.twig24
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig11
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig6
10 files changed, 254 insertions, 5 deletions
diff --git a/src/Wallabag/CoreBundle/Controller/EntryController.php b/src/Wallabag/CoreBundle/Controller/EntryController.php
index fafa49f1..f1376f43 100644
--- a/src/Wallabag/CoreBundle/Controller/EntryController.php
+++ b/src/Wallabag/CoreBundle/Controller/EntryController.php
@@ -4,11 +4,15 @@ namespace Wallabag\CoreBundle\Controller;
4 4
5use Pagerfanta\Adapter\DoctrineORMAdapter; 5use Pagerfanta\Adapter\DoctrineORMAdapter;
6use Pagerfanta\Exception\OutOfRangeCurrentPageException; 6use Pagerfanta\Exception\OutOfRangeCurrentPageException;
7use Pagerfanta\Pagerfanta;
7use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 8use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
8use Symfony\Bundle\FrameworkBundle\Controller\Controller; 9use Symfony\Bundle\FrameworkBundle\Controller\Controller;
10use Symfony\Component\HttpFoundation\RedirectResponse;
9use Symfony\Component\HttpFoundation\Request; 11use Symfony\Component\HttpFoundation\Request;
12use Symfony\Component\HttpFoundation\Response;
10use Symfony\Component\Routing\Generator\UrlGeneratorInterface; 13use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
11use Wallabag\CoreBundle\Entity\Entry; 14use Wallabag\CoreBundle\Entity\Entry;
15use Wallabag\CoreBundle\Form\Type\EditGroupSharesType;
12use Wallabag\CoreBundle\Form\Type\EntryFilterType; 16use Wallabag\CoreBundle\Form\Type\EntryFilterType;
13use Wallabag\CoreBundle\Form\Type\EditEntryType; 17use Wallabag\CoreBundle\Form\Type\EditEntryType;
14use Wallabag\CoreBundle\Form\Type\NewEntryType; 18use Wallabag\CoreBundle\Form\Type\NewEntryType;
@@ -16,6 +20,7 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
16use Wallabag\CoreBundle\Event\EntrySavedEvent; 20use Wallabag\CoreBundle\Event\EntrySavedEvent;
17use Wallabag\CoreBundle\Event\EntryDeletedEvent; 21use Wallabag\CoreBundle\Event\EntryDeletedEvent;
18use Wallabag\CoreBundle\Form\Type\SearchEntryType; 22use Wallabag\CoreBundle\Form\Type\SearchEntryType;
23use Wallabag\GroupBundle\Entity\Group;
19 24
20class EntryController extends Controller 25class EntryController extends Controller
21{ 26{
@@ -604,4 +609,88 @@ class EntryController extends Controller
604 { 609 {
605 return $this->showEntries('untagged', $request, $page); 610 return $this->showEntries('untagged', $request, $page);
606 } 611 }
612
613 /**
614 * @Route("/group-articles/{group}/{page}", name="group-presentations", defaults={"page" = "1"}, requirements={"page": "\d+", "group": "\d+"})
615 *
616 * @param Request $request
617 * @param Group $group
618 * @param int $page
619 * @return Response
620 */
621 public function showGroupSharedTemplatesAction(Request $request, Group $group, int $page)
622 {
623 if (!$this->getUser()->inGroup($group)) {
624 throw $this->createAccessDeniedException();
625 }
626
627 $repository = $this->get('wallabag_core.entry_repository');
628
629 /** @var QueryBuilder $entries */
630 $entries = $repository->findByGroup($group->getId());
631
632 $pagerAdapter = new DoctrineORMAdapter($entries->getQuery(), true, false);
633 $pagerFanta = new Pagerfanta($pagerAdapter);
634 $pagerFanta->setMaxPerPage(9);
635
636 $form = $this->createForm(EntryFilterType::class);
637
638 if ($request->query->has($form->getName())) {
639 // manually bind values from the request
640 $form->submit($request->query->get($form->getName()));
641
642 // build the query from the given form object
643 $this->get('lexik_form_filter.query_builder_updater')->addFilterConditions($form, $qb);
644 }
645
646 $searchTerm = (isset($request->get('search_entry')['term']) ? $request->get('search_entry')['term'] : '');
647
648 try {
649 $pagerFanta->setCurrentPage($page);
650 } catch (OutOfRangeCurrentPageException $e) {
651 if ($page > 1) {
652 return $this->redirect($this->generateUrl('group-presentations', [
653 'page' => $pagerFanta->getNbPages(),
654 'group' => $group->getId()
655 ]), 302);
656 }
657 }
658
659 return $this->render('WallabagCoreBundle:Entry:entries.html.twig', [
660 'form' => $form->createView(),
661 'entries' => $pagerFanta,
662 'currentPage' => $page,
663 'searchTerm' => $searchTerm,
664 ]);
665 }
666
667 /**
668 *
669 * @Route("/entry/group-shares/{entry}", name="group-shares-entry")
670 *
671 * @param Request $request
672 * @param Entry $entry
673 * @return Response
674 */
675 public function groupShareAction(Request $request, Entry $entry)
676 {
677 $this->checkUserAction($entry);
678
679 $form = $this->createForm(EditGroupSharesType::class, $entry, ['groups' => $this->getUser()->getGroups()]);
680
681 $form->handleRequest($request);
682
683 if ($form->isSubmitted() && $form->isValid()) {
684 $em = $this->getDoctrine()->getManager();
685 $em->persist($entry);
686 $em->flush();
687
688 return $this->redirect($this->generateUrl('view', ['id' => $entry->getId()]));
689 }
690
691 return $this->render('WallabagCoreBundle:Entry:_share_groups.html.twig', [
692 'form' => $form->createView(),
693 'entry' => $entry,
694 ]);
695 }
607} 696}
diff --git a/src/Wallabag/CoreBundle/Controller/ExportController.php b/src/Wallabag/CoreBundle/Controller/ExportController.php
index fda04cfb..4bb2b706 100644
--- a/src/Wallabag/CoreBundle/Controller/ExportController.php
+++ b/src/Wallabag/CoreBundle/Controller/ExportController.php
@@ -47,7 +47,7 @@ class ExportController extends Controller
47 * 47 *
48 * @Route("/export/{category}.{format}", name="export_entries", requirements={ 48 * @Route("/export/{category}.{format}", name="export_entries", requirements={
49 * "format": "epub|mobi|pdf|json|xml|txt|csv", 49 * "format": "epub|mobi|pdf|json|xml|txt|csv",
50 * "category": "all|unread|starred|archive|tag_entries|untagged|search" 50 * "category": "all|unread|starred|archive|tag_entries|untagged|search|group-presentations"
51 * }) 51 * })
52 * 52 *
53 * @return \Symfony\Component\HttpFoundation\Response 53 * @return \Symfony\Component\HttpFoundation\Response
diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php
index 84555b36..028eeb52 100644
--- a/src/Wallabag/CoreBundle/Entity/Entry.php
+++ b/src/Wallabag/CoreBundle/Entity/Entry.php
@@ -235,7 +235,7 @@ class Entry
235 235
236 /** 236 /**
237 * @var ArrayCollection 237 * @var ArrayCollection
238 * @ORM\ManyToMany(targetEntity="Wallabag\GroupBundle\Entity\Group", inversedBy="presentations", cascade={"persist"}) 238 * @ORM\ManyToMany(targetEntity="Wallabag\GroupBundle\Entity\Group", inversedBy="entries", cascade={"persist"})
239 */ 239 */
240 private $groupShares; 240 private $groupShares;
241 241
@@ -784,4 +784,20 @@ class Entry
784 784
785 return $this; 785 return $this;
786 } 786 }
787
788 /**
789 * @return ArrayCollection
790 */
791 public function getGroupShares()
792 {
793 return $this->groupShares;
794 }
795
796 /**
797 * @param ArrayCollection $groupShares
798 */
799 public function setGroupShares($groupShares)
800 {
801 $this->groupShares = $groupShares;
802 }
787} 803}
diff --git a/src/Wallabag/CoreBundle/Form/Type/EditGroupSharesType.php b/src/Wallabag/CoreBundle/Form/Type/EditGroupSharesType.php
new file mode 100644
index 00000000..2c2e3b36
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Form/Type/EditGroupSharesType.php
@@ -0,0 +1,43 @@
1<?php
2
3namespace Wallabag\CoreBundle\Form\Type;
4
5use Symfony\Bridge\Doctrine\Form\Type\EntityType;
6use Symfony\Component\Form\AbstractType;
7use Symfony\Component\Form\Extension\Core\Type\SubmitType;
8use Symfony\Component\Form\FormBuilderInterface;
9use Symfony\Component\OptionsResolver\OptionsResolver;
10use Wallabag\CoreBundle\Entity\Entry;
11use Wallabag\GroupBundle\Entity\Group;
12
13class EditGroupSharesType extends AbstractType
14{
15 public function buildForm(FormBuilderInterface $builder, array $options)
16 {
17 $builder
18 ->add('groupshares', EntityType::class, [
19 'required' => true,
20 'class' => Group::class,
21 'choices' => $options['groups'],
22 'multiple' => true,
23 'expanded' => true,
24 ])
25 ->add('save', SubmitType::class, [
26 'label' => 'Share',
27 ])
28 ;
29 }
30
31 public function configureOptions(OptionsResolver $resolver)
32 {
33 $resolver->setDefaults([
34 'data_class' => Entry::class,
35 ]);
36 $resolver->setRequired('groups');
37 }
38
39 public function getBlockPrefix()
40 {
41 return 'group_shares';
42 }
43}
diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php
index 9bda4e15..ade3d6bc 100644
--- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php
+++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php
@@ -414,4 +414,17 @@ class EntryRepository extends EntityRepository
414 ->getQuery() 414 ->getQuery()
415 ->getResult(); 415 ->getResult();
416 } 416 }
417
418 /**
419 * Find all entries for a group
420 *
421 * @param $groupId
422 * @return \Doctrine\ORM\QueryBuilder
423 */
424 public function findByGroup($groupId)
425 {
426 return $this->createQueryBuilder('p')
427 ->innerJoin('p.groupShares', 'g', 'WITH', 'g.id = :group')
428 ->setParameter(':group', $groupId);
429 }
417} 430}
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
index 8f507c40..94bce434 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
@@ -224,6 +224,7 @@ entry:
224 delete_public_link: 'delete public link' 224 delete_public_link: 'delete public link'
225 export: 'Export' 225 export: 'Export'
226 print: 'Print' 226 print: 'Print'
227 groups: Groups
227 problem: 228 problem:
228 label: 'Problems?' 229 label: 'Problems?'
229 description: 'Does this article appear wrong?' 230 description: 'Does this article appear wrong?'
@@ -515,6 +516,31 @@ group:
515 delete: Delete 516 delete: Delete
516 delete_confirm: Are you sure? 517 delete_confirm: Are you sure?
517 back_to_list: Back to list 518 back_to_list: Back to list
519 role_label: Default roles
520 access_label: Access
521 password_label: Password (if applicable)
522
523 roles:
524 readonly: Read only
525 write: Write access
526 manage_entries: Managing articles
527 manage_users: Managing members
528 admin: Administrator
529 access:
530 open: Open
531 request: On request
532 password: With password
533 invitation: Upon invitation
534 hidden: Upon invitation and private
535 tab_menu:
536 public: Public groups
537 own: My groups
538 manage:
539 label: Manage this group
540 entries:
541 label: Entries shared with this group
542 leave:
543 label: Leave
518 544
519user: 545user:
520 page_title: Users management 546 page_title: Users management
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
index d909cf15..007d5b2a 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
@@ -240,6 +240,7 @@ entry:
240 delete_public_link: "Supprimer le lien public" 240 delete_public_link: "Supprimer le lien public"
241 export: "Exporter" 241 export: "Exporter"
242 print: "Imprimer" 242 print: "Imprimer"
243 groups: Groupes
243 problem: 244 problem:
244 label: "Un problème ?" 245 label: "Un problème ?"
245 description: "Est-ce que cet article s’affiche mal ?" 246 description: "Est-ce que cet article s’affiche mal ?"
@@ -549,6 +550,32 @@ group:
549 tab_menu: 550 tab_menu:
550 public: Groupes publics 551 public: Groupes publics
551 own: Mes groupes 552 own: Mes groupes
553 requests:
554 list: Liste des requêtes
555 sent: Requête envoyée
556 username: Utilisateur
557 action: Action
558 manage:
559 label: Gérer le groupe
560 title: Gérer le groupe
561 entries:
562 label: Liste des articles partagés avec ce groupe
563 leave:
564 label: Sortir de ce groupe
565 user:
566 inGroup: "{0}Il n'y a personne dans ce groupe|{1}Vous êtes tout seul dans ce groupe|]1,Inf[Vous êtes %count% utilisateurs dans ce groupe"
567 notInGroup: "{0}Il n'y a personne dans ce groupe|{1}Il y a un seul utilisateur dans ce groupe|]1,Inf[%count% utilisateurs dans ce groupe"
568 members:
569 empty: Le groupe est vide
570 name: Nom d'utilisateur
571 role: Rôle
572 action: Action
573 edit: Modifier les droits de l'utilisateur
574 exclude: Exclure l'utilisateur
575 edit_user:
576 title: Édition des droits de l'utilisateur
577 role: Rôle
578 cancel: Annuler
552 579
553user: 580user:
554 page_title: "Gestion des utilisateurs" 581 page_title: "Gestion des utilisateurs"
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/_share_groups.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/_share_groups.html.twig
new file mode 100644
index 00000000..5c81ccc2
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/_share_groups.html.twig
@@ -0,0 +1,24 @@
1<!-- Groups Modal -->
2<div id="groups-modal" class="modal bottom-sheet">
3 <div class="modal-content">
4 <div class="row">
5 <h4>Groups</h4>
6 <p>Select the groups you want to share this article with</p>
7 <form name="search" method="POST" action="{{ path('group-shares-entry', {'entry': entry.id})}}">
8 {% if form_errors(form) %}
9 <span class="black-text">{{ form_errors(form) }}</span>
10 {% endif %}
11
12 {% if form_errors(form.groupshares) %}
13 <span class="black-text">{{ form_errors(form.groupshares) }}</span>
14 {% endif %}
15
16 {{ form_widget(form.groupshares) }}
17 {{ form_widget(form.save, {'attr': {'class': 'modal-action modal-close waves-effect waves-light btn'}}) }}
18
19 {{ form_rest(form) }}
20 </form>
21
22 </div>
23 </div>
24</div>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
index 4cff7bf2..05f51aa8 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
@@ -170,6 +170,15 @@
170 </div> 170 </div>
171 </li> 171 </li>
172 172
173 {#{% if craue_setting('groups') %}#}
174 <li class="bold border-bottom hide-on-med-and-down">
175 <a class="waves-effect groups-button" onclick="$('#groups-modal').openModal();" title="{{ 'entry.view.left_menu.group'|trans }}">
176 <i class="material-icons small">group</i>
177 <span>{{ 'entry.view.left_menu.groups'|trans }}</span>
178 </a>
179 </li>
180 {#{% endif %}#}
181
173 {% if craue_setting('show_printlink') %} 182 {% if craue_setting('show_printlink') %}
174 <li class="bold border-bottom hide-on-med-and-down"> 183 <li class="bold border-bottom hide-on-med-and-down">
175 <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.print'|trans }}" href="javascript: window.print();"> 184 <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.print'|trans }}" href="javascript: window.print();">
@@ -287,6 +296,8 @@
287 </div> 296 </div>
288 </div> 297 </div>
289 298
299 {{ render(controller( "WallabagCoreBundle:Entry:GroupShare", { 'entry': entry.id } )) }}
300
290<script id="annotationroutes" type="application/json"> 301<script id="annotationroutes" type="application/json">
291{ 302{
292 "prefix": "", 303 "prefix": "",
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
index 575c77f2..92b47dac 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
@@ -75,14 +75,14 @@
75 <li class="bold {% if currentRoute starts with 'user_' %}active{% endif %}"> 75 <li class="bold {% if currentRoute starts with 'user_' %}active{% endif %}">
76 <a class="waves-effect" href="{{ path('user_index') }}">{{ 'menu.left.users_management'|trans }}</a> 76 <a class="waves-effect" href="{{ path('user_index') }}">{{ 'menu.left.users_management'|trans }}</a>
77 </li> 77 </li>
78 <li class="bold {% if currentRoute starts with 'group_' %}active{% endif %}">
79 <a class="waves-effect" href="{{ path('group_index') }}">{{ 'menu.left.groups_management'|trans }}</a>
80 </li>
81 78
82 <li class="bold border-bottom {% if currentRoute == 'craue_config_settings_modify' %}active{% endif %}"> 79 <li class="bold border-bottom {% if currentRoute == 'craue_config_settings_modify' %}active{% endif %}">
83 <a class="waves-effect" href="{{ path('craue_config_settings_modify') }}">{{ 'menu.left.internal_settings'|trans }}</a> 80 <a class="waves-effect" href="{{ path('craue_config_settings_modify') }}">{{ 'menu.left.internal_settings'|trans }}</a>
84 </li> 81 </li>
85 {% endif %} 82 {% endif %}
83 <li class="bold {% if currentRoute starts with 'group_' %}active{% endif %}">
84 <a class="waves-effect" href="{{ path('group_index') }}">{{ 'menu.left.groups_management'|trans }}</a>
85 </li>
86 <li class="bold {% if currentRoute == 'import' %}active{% endif %}"> 86 <li class="bold {% if currentRoute == 'import' %}active{% endif %}">
87 <a class="waves-effect" href="{{ path('import') }}">{{ 'menu.left.import'|trans }}</a> 87 <a class="waves-effect" href="{{ path('import') }}">{{ 'menu.left.import'|trans }}</a>
88 </li> 88 </li>