diff options
Diffstat (limited to 'src/Wallabag/CoreBundle')
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 | ||
5 | use Pagerfanta\Adapter\DoctrineORMAdapter; | 5 | use Pagerfanta\Adapter\DoctrineORMAdapter; |
6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; | 6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; |
7 | use Pagerfanta\Pagerfanta; | ||
7 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; | 8 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; |
8 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; | 9 | use Symfony\Bundle\FrameworkBundle\Controller\Controller; |
10 | use Symfony\Component\HttpFoundation\RedirectResponse; | ||
9 | use Symfony\Component\HttpFoundation\Request; | 11 | use Symfony\Component\HttpFoundation\Request; |
12 | use Symfony\Component\HttpFoundation\Response; | ||
10 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | 13 | use Symfony\Component\Routing\Generator\UrlGeneratorInterface; |
11 | use Wallabag\CoreBundle\Entity\Entry; | 14 | use Wallabag\CoreBundle\Entity\Entry; |
15 | use Wallabag\CoreBundle\Form\Type\EditGroupSharesType; | ||
12 | use Wallabag\CoreBundle\Form\Type\EntryFilterType; | 16 | use Wallabag\CoreBundle\Form\Type\EntryFilterType; |
13 | use Wallabag\CoreBundle\Form\Type\EditEntryType; | 17 | use Wallabag\CoreBundle\Form\Type\EditEntryType; |
14 | use Wallabag\CoreBundle\Form\Type\NewEntryType; | 18 | use Wallabag\CoreBundle\Form\Type\NewEntryType; |
@@ -16,6 +20,7 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; | |||
16 | use Wallabag\CoreBundle\Event\EntrySavedEvent; | 20 | use Wallabag\CoreBundle\Event\EntrySavedEvent; |
17 | use Wallabag\CoreBundle\Event\EntryDeletedEvent; | 21 | use Wallabag\CoreBundle\Event\EntryDeletedEvent; |
18 | use Wallabag\CoreBundle\Form\Type\SearchEntryType; | 22 | use Wallabag\CoreBundle\Form\Type\SearchEntryType; |
23 | use Wallabag\GroupBundle\Entity\Group; | ||
19 | 24 | ||
20 | class EntryController extends Controller | 25 | class 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 | |||
3 | namespace Wallabag\CoreBundle\Form\Type; | ||
4 | |||
5 | use Symfony\Bridge\Doctrine\Form\Type\EntityType; | ||
6 | use Symfony\Component\Form\AbstractType; | ||
7 | use Symfony\Component\Form\Extension\Core\Type\SubmitType; | ||
8 | use Symfony\Component\Form\FormBuilderInterface; | ||
9 | use Symfony\Component\OptionsResolver\OptionsResolver; | ||
10 | use Wallabag\CoreBundle\Entity\Entry; | ||
11 | use Wallabag\GroupBundle\Entity\Group; | ||
12 | |||
13 | class 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 | ||
519 | user: | 545 | user: |
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 | ||
553 | user: | 580 | user: |
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> |