aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Wallabag/GroupBundle
diff options
context:
space:
mode:
Diffstat (limited to 'src/Wallabag/GroupBundle')
-rw-r--r--src/Wallabag/GroupBundle/Controller/ManageController.php184
-rw-r--r--src/Wallabag/GroupBundle/Form/UserGroupType.php6
-rw-r--r--src/Wallabag/GroupBundle/Resources/config/services.yml7
-rw-r--r--src/Wallabag/GroupBundle/Resources/views/Manage/edit_user.html.twig26
-rw-r--r--src/Wallabag/GroupBundle/Resources/views/Manage/index.html.twig29
-rw-r--r--src/Wallabag/GroupBundle/Resources/views/Manage/manage.html.twig102
-rw-r--r--src/Wallabag/GroupBundle/Resources/views/Manage/requests.html.twig31
7 files changed, 378 insertions, 7 deletions
diff --git a/src/Wallabag/GroupBundle/Controller/ManageController.php b/src/Wallabag/GroupBundle/Controller/ManageController.php
index 31a0c7b1..7214d899 100644
--- a/src/Wallabag/GroupBundle/Controller/ManageController.php
+++ b/src/Wallabag/GroupBundle/Controller/ManageController.php
@@ -2,6 +2,7 @@
2 2
3namespace Wallabag\GroupBundle\Controller; 3namespace Wallabag\GroupBundle\Controller;
4 4
5use Pagerfanta\Adapter\ArrayAdapter;
5use Pagerfanta\Adapter\DoctrineORMAdapter; 6use Pagerfanta\Adapter\DoctrineORMAdapter;
6use Pagerfanta\Exception\OutOfRangeCurrentPageException; 7use Pagerfanta\Exception\OutOfRangeCurrentPageException;
7use Pagerfanta\Pagerfanta; 8use Pagerfanta\Pagerfanta;
@@ -15,6 +16,7 @@ use Wallabag\GroupBundle\Entity\Group;
15use Wallabag\GroupBundle\Entity\UserGroup; 16use Wallabag\GroupBundle\Entity\UserGroup;
16use Wallabag\GroupBundle\Form\GroupType; 17use Wallabag\GroupBundle\Form\GroupType;
17use Wallabag\GroupBundle\Form\NewGroupType; 18use Wallabag\GroupBundle\Form\NewGroupType;
19use Wallabag\GroupBundle\Form\UserGroupType;
18use Wallabag\UserBundle\Entity\User; 20use Wallabag\UserBundle\Entity\User;
19 21
20/** 22/**
@@ -210,4 +212,186 @@ class ManageController extends Controller
210 } 212 }
211 throw $this->createAccessDeniedException(); 213 throw $this->createAccessDeniedException();
212 } 214 }
215
216 /**
217 * @Route("/join/{group}", name="group_join")
218 * @param Group $group
219 * @return Response
220 */
221 public function joinGroupAction(Group $group): Response
222 {
223 $em = $this->getDoctrine()->getManager();
224
225 if ($group->getAcceptSystem() === Group::ACCESS_PASSWORD) {
226 return $this->redirectToRoute('group_password', ['group' => $group->getId()]);
227 }
228 $this->getUser()->addAGroup($group, $group->getDefaultRole());
229
230 $em->flush();
231
232 return $this->redirect($this->generateUrl('group_index'), 302);
233 }
234
235 /**
236 * @Route("/manage/{group}/{page}", name="group-manage", defaults={"page" = "1"})
237 * @param Group $group
238 * @return Response
239 */
240 public function manageGroupUsersAction(Group $group, int $page): Response
241 {
242 if ($this->getUser()->getGroupRoleForUser($group) < Group::ROLE_MANAGE_USERS) {
243 $this->createAccessDeniedException();
244 }
245
246 $members = $this->get('wallabag_user.user_repository')->findGroupMembers($group->getId());
247
248 $pagerAdapter = new DoctrineORMAdapter($members->getQuery(), true, false);
249 $pagerFanta = new Pagerfanta($pagerAdapter);
250 $pagerFanta->setMaxPerPage(9);
251
252 try {
253 $pagerFanta->setCurrentPage($page);
254 } catch (OutOfRangeCurrentPageException $e) {
255 if ($page > 1) {
256 return $this->redirect($this->generateUrl('groups', ['page' => $pagerFanta->getNbPages()]), 302);
257 }
258 }
259
260 return $this->render('WallabagGroupBundle:Manage:manage.html.twig', [
261 'members' => $pagerFanta,
262 'group' => $group,
263 'currentPage' => $page,
264 ]);
265 }
266
267 /**
268 * @Route("/leave/{group}", name="group_leave")
269 * @param Group $group
270 * @return Response
271 */
272 public function leaveGroupAction(Group $group): Response
273 {
274 $logger = $this->get('logger');
275 $em = $this->getDoctrine()->getManager();
276 $removeGroup = false;
277
278 if ($this->getUser()->getGroupRoleForUser($group) == Group::ROLE_ADMIN) {
279 $logger->info('User ' . $this->getUser()->getUsername() . ' is the admin for group ' . $group->getName());
280 $newUser = $group->getUsers()->first();
281 $newUser->setGroupRole($group, Group::ROLE_ADMIN);
282 $logger->info('The new admin for group ' . $group->getName() . ' is user ' . $newUser->getUsername());
283 }
284
285 if ($group->getUsers()->count() <= 1) {
286 $logger->info('User ' . $this->getUser()->getUsername() . ' was the last one on the group ' . $group->getName() . ' so it will be deleted');
287 $removeGroup = true;
288 }
289
290 $logger->info('Removing user ' . $this->getUser()->getUsername() . ' from group ' . $group->getName());
291 $em->remove($this->getUser()->getUserGroupFromGroup($group));
292
293 if ($removeGroup) {
294 $logger->info("Removing group " . $group->getName() . " as it doesn't contains users anymore");
295 $em->remove($group);
296 }
297
298 $em->flush();
299 return $this->redirect($this->generateUrl('groups'), 302);
300 }
301
302 /**
303 * @Route("/requests/{group}/{page}", name="group-requests", defaults={"page" = "1"})
304 * @param Request $request
305 * @param int $page
306 * @return Response
307 */
308 public function showRequestsAction(Group $group, int $page): Response
309 {
310 if ($this->getUser()->getGroupRoleForUser($group) < Group::ROLE_MANAGE_USERS) {
311 $this->createAccessDeniedException();
312 }
313
314 $requests = $group->getRequests();
315 $pagerAdapter = new ArrayAdapter($requests->toArray());
316
317 $pagerFanta = new Pagerfanta($pagerAdapter);
318 $pagerFanta->setMaxPerPage(9);
319
320 try {
321 $pagerFanta->setCurrentPage($page);
322 } catch (OutOfRangeCurrentPageException $e) {
323 if ($page > 1) {
324 return $this->redirect($this->generateUrl('groups', ['page' => $pagerFanta->getNbPages()]), 302);
325 }
326 }
327
328 return $this->render('WallabagGroupBundle:Manage:requests.html.twig', [
329 'requests' => $pagerFanta,
330 'group' => $group,
331 'currentPage' => $page,
332 ]);
333 }
334
335 /**
336 * @Route("/activate/{group}/{user}/{accept}", name="group-activate", requirements={"accept" = "\d+"})
337 * @param Group $group
338 * @param User $user
339 * @param $accept
340 * @return Response
341 */
342 public function postRequestAction(Group $group, User $user, $accept): Response
343 {
344 if (!$this->getUser() < Group::ROLE_MANAGE_USERS) {
345 $this->createAccessDeniedException("You don't have the rights to do this");
346 }
347
348 $em = $this->getDoctrine()->getManager();
349
350 $accept = $accept == 1;
351 $user->getUserGroupFromGroup($group)->setAccepted($accept);
352 if (!$accept) {
353 $em->remove($user->getUserGroupFromGroup($group));
354 }
355
356 $em->flush();
357
358 return $this->redirectToRoute('group_index');
359 }
360
361 /**
362 * @Route("/user-edit/{group}/{user}", name="group-user-edit")
363 * @param Request $request
364 * @param Group $group
365 * @param User $user
366 * @return Response
367 */
368 public function editGroupUsersAction(Request $request, Group $group, User $user): Response
369 {
370 if ($this->getUser()->getGroupRoleForUser($group) < Group::ROLE_MANAGE_USERS) {
371 $this->createAccessDeniedException();
372 }
373
374 $groupUser = $user->getUserGroupFromGroup($group);
375 $editForm = $this->createForm(UserGroupType::class, $groupUser);
376 $editForm->handleRequest($request);
377
378 if ($editForm->isSubmitted() && $editForm->isValid()) {
379 $em = $this->getDoctrine()->getManager();
380 $em->persist($groupUser);
381 $em->flush();
382
383 $this->get('session')->getFlashBag()->add(
384 'notice',
385 $this->get('translator')->trans('flashes.group.notice.user.edited', ['%user%' => $user->getUsername(), '%group%' => $group->getName()])
386 );
387
388 return $this->redirectToRoute('group-manage', ['group' => $group->getId()]);
389 }
390
391 return $this->render('WallabagGroupBundle:Manage:edit_user.html.twig', array(
392 'user' => $user,
393 'group' => $group,
394 'edit_form' => $editForm->createView(),
395 ));
396 }
213} 397}
diff --git a/src/Wallabag/GroupBundle/Form/UserGroupType.php b/src/Wallabag/GroupBundle/Form/UserGroupType.php
index e8f814e4..326fa682 100644
--- a/src/Wallabag/GroupBundle/Form/UserGroupType.php
+++ b/src/Wallabag/GroupBundle/Form/UserGroupType.php
@@ -1,6 +1,6 @@
1<?php 1<?php
2 2
3namespace Wallabag\GroupBundle\Form\Type; 3namespace Wallabag\GroupBundle\Form;
4 4
5use Wallabag\GroupBundle\Entity\Group; 5use Wallabag\GroupBundle\Entity\Group;
6use Symfony\Component\Form\AbstractType; 6use Symfony\Component\Form\AbstractType;
@@ -23,7 +23,7 @@ class UserGroupType extends AbstractType
23 'choices' => [ 23 'choices' => [
24 'group.roles.readonly' => Group::ROLE_READ_ONLY, 24 'group.roles.readonly' => Group::ROLE_READ_ONLY,
25 'group.roles.write' => Group::ROLE_WRITE, 25 'group.roles.write' => Group::ROLE_WRITE,
26 'group.roles.manage_prez' => Group::ROLE_MANAGE_PREZ, 26 'group.roles.manage_entries' => Group::ROLE_MANAGE_ENTRIES,
27 'group.roles.manage_users' => Group::ROLE_MANAGE_USERS, 27 'group.roles.manage_users' => Group::ROLE_MANAGE_USERS,
28 'group.roles.admin' => Group::ROLE_ADMIN, 28 'group.roles.admin' => Group::ROLE_ADMIN,
29 ], 29 ],
@@ -40,7 +40,7 @@ class UserGroupType extends AbstractType
40 public function configureOptions(OptionsResolver $resolver) 40 public function configureOptions(OptionsResolver $resolver)
41 { 41 {
42 $resolver->setDefaults(array( 42 $resolver->setDefaults(array(
43 'data_class' => 'Strut\StrutBundle\Entity\UserGroup', 43 'data_class' => 'Wallabag\GroupBundle\Entity\UserGroup',
44 )); 44 ));
45 } 45 }
46} 46}
diff --git a/src/Wallabag/GroupBundle/Resources/config/services.yml b/src/Wallabag/GroupBundle/Resources/config/services.yml
index 76e8427a..618f7ed7 100644
--- a/src/Wallabag/GroupBundle/Resources/config/services.yml
+++ b/src/Wallabag/GroupBundle/Resources/config/services.yml
@@ -1,3 +1,8 @@
1services: 1services:
2 sha256salted_encoder: 2 sha256salted_encoder:
3 class: Strut\StrutBundle\Service\Sha256Salted \ No newline at end of file 3 class: Wallabag\GroupBundle\Service\Sha256Salted
4
5 wallabag_core.filter.type.entry:
6 class: Wallabag\GroupBundle\Form\UserGroupType
7 tags:
8 - { name: form.type } \ No newline at end of file
diff --git a/src/Wallabag/GroupBundle/Resources/views/Manage/edit_user.html.twig b/src/Wallabag/GroupBundle/Resources/views/Manage/edit_user.html.twig
new file mode 100644
index 00000000..b7771690
--- /dev/null
+++ b/src/Wallabag/GroupBundle/Resources/views/Manage/edit_user.html.twig
@@ -0,0 +1,26 @@
1{% extends "WallabagCoreBundle::layout.html.twig" %}
2
3{% block title %}{{ 'group.edit_user.title'|trans }}{% endblock %}
4
5{% block content %}
6
7<div class="row">
8 <div class="col-md-6">
9
10 {{ form_start(edit_form) }}
11 {{ form_errors(edit_form) }}
12
13 <div class="form-group">
14 {{ form_label(edit_form.role) }}
15 {{ form_errors(edit_form.role) }}
16 {{ form_widget(edit_form.role) }}
17 </div>
18
19 {{ form_widget(edit_form.save, {'attr': {'class': 'btn waves-effect'}}) }}
20 <a class="btn btn-default" href="{{ path('group-manage', {'group': group.id}) }}">{{ 'group.edit_user.cancel' | trans }}</a>
21 {{ form_widget(edit_form._token) }}
22 {{ form_end(edit_form) }}
23 </div>
24</div>
25
26{% endblock %}
diff --git a/src/Wallabag/GroupBundle/Resources/views/Manage/index.html.twig b/src/Wallabag/GroupBundle/Resources/views/Manage/index.html.twig
index 01466e52..35a70400 100644
--- a/src/Wallabag/GroupBundle/Resources/views/Manage/index.html.twig
+++ b/src/Wallabag/GroupBundle/Resources/views/Manage/index.html.twig
@@ -12,7 +12,7 @@
12 <p class="help">{{ 'group.description'|trans|raw }}</p> 12 <p class="help">{{ 'group.description'|trans|raw }}</p>
13 13
14 {% if groups is not empty %} 14 {% if groups is not empty %}
15 <table class="bordered"> 15 <table class="bordered responsive-table">
16 <thead> 16 <thead>
17 <tr> 17 <tr>
18 <th>{{ 'group.form.name_label'|trans }}</th> 18 <th>{{ 'group.form.name_label'|trans }}</th>
@@ -24,9 +24,32 @@
24 {% for group in groups %} 24 {% for group in groups %}
25 <tr> 25 <tr>
26 <td>{{ group.name }}</td> 26 <td>{{ group.name }}</td>
27 <td></td>
28 <td> 27 <td>
29 <a href="{{ path('group_edit', { 'id': group.id }) }}">{{ 'group.list.edit_action'|trans }}</a> 28 {% if app.user in group.users and app.user.inGroup(group) %}
29 {{ 'group.user.inGroup' | transchoice(group.users | length) }}
30 {% else %}
31 {{ 'group.user.notInGroup' | transchoice(group.users | length) }}
32 {% endif %}
33 </td>
34 <td>
35 {% if app.user in group.users and app.user.inGroup(group) %}
36 {% if app.user.getGroupRoleForUser(group) >= 5 %}
37 <a href="{{ path('group_edit', { 'id': group.id }) }}" class="waves-effect waves-light btn tooltipped" data-delay="50" data-position="bottom" data-tooltip="{{ 'group.list.edit_action'|trans }}"><i class="material-icons">edit</i></a>
38 <a href="{{ path('group-manage', { 'group': group.id }) }}" class="waves-effect waves-light btn tooltipped" data-delay="50" data-position="bottom" data-tooltip="{{ 'group.manage.label'|trans }}"><i class="material-icons">settings_applications</i></a>
39 {% endif %}
40 <a href="{{ path('group-presentations', { 'group': group.id }) }}" class="waves-effect waves-light btn tooltipped" data-delay="50" data-position="bottom" data-tooltip="{{ 'group.entries.label'|trans }}"><i class="material-icons">view_list</i></a>
41 <a href="{{ path('group_leave', { 'group': group.id }) }}" class="waves-effect waves-light btn red tooltipped" data-delay="50" data-position="bottom" data-tooltip="{{ 'group.leave.label'|trans }}"><i class="material-icons">clear</i></a>
42 {% elseif app.user in group.users and not app.user.inGroup(group) %}
43 {{ 'group.requests.sent' | trans }}
44 {% else %}
45 <a href="{{ path('group_join', { 'group': group.id }) }}" class="waves-effect waves-light btn tooltipped" data-tooltip="{{ 'group.join.label'|trans }}" data-delay="50" data-position="bottom">
46 {% if group.acceptSystem == 3 %}
47 <i class="material-icons md-18 vertical-align-middle" data-toggle="tooltip" data-placement="bottom" title="{{ 'group.join'|trans }}">lock</i>
48 {% else %}
49 <i class="material-icons" data-toggle="tooltip" data-placement="bottom" title="{{ 'group.join'|trans }}">input</i>
50 {% endif %}
51 </a>
52 {% endif %}
30 </td> 53 </td>
31 </tr> 54 </tr>
32 {% endfor %} 55 {% endfor %}
diff --git a/src/Wallabag/GroupBundle/Resources/views/Manage/manage.html.twig b/src/Wallabag/GroupBundle/Resources/views/Manage/manage.html.twig
new file mode 100644
index 00000000..2226b299
--- /dev/null
+++ b/src/Wallabag/GroupBundle/Resources/views/Manage/manage.html.twig
@@ -0,0 +1,102 @@
1{% extends "WallabagCoreBundle::layout.html.twig" %}
2
3{% block title %}{{ 'group.manage.title' |trans({ '%group%': group.name }) }}{% endblock %}
4
5{% block content %}
6
7<div class="row">
8 <div class="input-field col s12">
9 <p>
10 {{ 'group.form.role_label' |trans }}:
11 <em>
12 {% if group.defaultRole == 1 %}
13 {{ 'group.roles.readonly' | trans }}
14 {% elseif group.defaultRole == 2 %}
15 {{ 'group.roles.write' | trans }}
16 {% elseif group.defaultRole == 3 %}
17 {{ 'group.roles.manage_prez' | trans }}
18 {% elseif group.defaultRole == 5 %}
19 {{ 'group.roles.manage_users' | trans }}
20 {% elseif group.defaultRole == 10 %}
21 {{ 'group.roles.admin' | trans }}
22 {% else %}
23 {{ 'group.roles.unknown' | trans }}
24 {% endif %}
25 </em>
26 </p>
27 <p>
28 {{ 'group.form.access_label' | trans }}:
29 <em>
30 {% if group.acceptSystem == 1 %}
31 {{ 'group.access.open' | trans }}
32 {% elseif group.acceptSystem == 2 %}
33 {{ 'group.access.request' | trans }}
34 {% elseif group.acceptSystem == 3 %}
35 {{ 'group.access.password' | trans }}
36 {% elseif group.acceptSystem == 4 %}
37 {{ 'group.access.invitation' | trans }}
38 {% elseif group.acceptSystem == 10 %}
39 {{ 'group.access.hidden' | trans }}
40 {% else %}
41 {{ 'group.access.unknown' | trans }}
42 {% endif %}
43 </em>
44 </p>
45 <a href="{{ path('group_edit', {'id' : group.id}) }}" class="btn waves-effect">{{ 'group.edit_group' | trans }}</a>
46 {% if group.acceptSystem == 2 %}
47 <a href="{{ path('group-requests', {'group' : group.id}) }}" class="btn waves-effect">{{ 'group.requests.list' | trans }} <span class="badge">{{ group.getRequests() | length }}</span></a>
48 {% elseif group.acceptSystem >= 4 %}
49 <a href="{{ path('group-invitations', {'group' : group.id}) }}" class="btn waves-effect">{{ 'group.edit.invitations' | trans }} <span class="badge">{{ group.getInvited() | length }}</span></a>
50 {% endif %}
51 <a href="{{ path('group_delete', { 'id': group.id }) }}" class="btn waves-effect red"><i class="material-icons md-18" data-toggle="tooltip" data-placement="bottom" title="{{ 'group.form.delete'|trans }}">delete</i></a>
52
53 {% if members | length > 1 %}
54 <table class="table">
55 <thead>
56 <tr>
57 <th>{{ 'group.members.name'|trans }}</th>
58 <th>{{ 'group.members.role' | trans }}</th>
59 <th>{{ 'group.members.action'|trans }}</th>
60 </tr>
61 </thead>
62
63 <tbody>
64 {% for user in members %}
65 {% if user != app.user %}
66 <tr>
67 <td>{{ user.username }}</td>
68 <td>
69 {% if user.getGroupRoleForUser(group) == 1 %}
70 {{ 'group.roles.readonly' | trans }}
71 {% elseif user.getGroupRoleForUser(group) == 2 %}
72 {{ 'group.roles.write' | trans }}
73 {% elseif user.getGroupRoleForUser(group) == 3 %}
74 {{ 'group.roles.manage_prez' | trans }}
75 {% elseif user.getGroupRoleForUser(group) == 5 %}
76 {{ 'group.roles.manage_users' | trans }}
77 {% elseif user.getGroupRoleForUser(group) == 10 %}
78 {{ 'group.roles.admin' | trans }}
79 {% else %}
80 {{ 'group.roles.unknown' | trans }}
81 {% endif %}
82 </td>
83 <td>
84 <a href="{{ path('group-user-edit', { 'group': group.id, 'user': user.id }) }}" class="btn waves-effect"><i class="material-icons md-18" data-toggle="tooltip" data-placement="bottom" title="{{ 'group.members.edit'|trans }}">edit</i></a>
85 <a class="btn waves-effect red" href="{{ path('group-user-exclude', { 'group': group.id, 'user': user.id }) }}"><i class="material-icons md-18" data-toggle="tooltip" data-placement="bottom" title="{{ 'group.members.exclude'|trans }}">clear</i></a>
86 </td>
87 </tr>
88 {% endif %}
89 {% endfor %}
90 </tbody>
91 </table>
92 {% else %}
93 <p>{{ 'group.members.empty' | trans }}</p>
94 {% endif %}
95 <div class="pull-right">
96 {% if members.getNbPages > 1 %}
97 {{ pagerfanta(members, 'twitter_bootstrap3', {'proximity': 1}) }}
98 {% endif %}
99 </div>
100 </div>
101</div>
102{% endblock %}
diff --git a/src/Wallabag/GroupBundle/Resources/views/Manage/requests.html.twig b/src/Wallabag/GroupBundle/Resources/views/Manage/requests.html.twig
new file mode 100644
index 00000000..36d069ce
--- /dev/null
+++ b/src/Wallabag/GroupBundle/Resources/views/Manage/requests.html.twig
@@ -0,0 +1,31 @@
1{% extends "WallabagCoreBundle::layout.html.twig" %}
2
3{% block title %}{{ 'group.requests.list'|trans }}{% endblock %}
4
5{% block content %}
6<div class="row">
7 <div class="col s12">
8
9 <table class="table">
10 <thead>
11 <tr>
12 <th>{{ 'group.requests.username'|trans }}</th>
13 <th>{{ 'group.requests.action'|trans }}</th>
14 </tr>
15 </thead>
16
17 <tbody>
18 {% for request in requests %}
19 <tr>
20 <td>{{ request.username }}</td>
21 <td>
22 <a class="btn waves-effect" href="{{ path('group-activate', {'group': group.id, 'user': request.id, 'accept': 1}) }}"><i class="material-icons">check</i></a>
23 <a class="btn waves-effect red" href="{{ path('group-activate', {'group': group.id, 'user': request.id, 'accept': 2}) }}"><i class="material-icons">close</i></a>
24 </td>
25 </tr>
26 {% endfor %}
27 </tbody>
28 </table>
29 </div>
30</div>
31{% endblock %}