diff options
Diffstat (limited to 'src/Wallabag/GroupBundle')
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 | ||
3 | namespace Wallabag\GroupBundle\Controller; | 3 | namespace Wallabag\GroupBundle\Controller; |
4 | 4 | ||
5 | use Pagerfanta\Adapter\ArrayAdapter; | ||
5 | use Pagerfanta\Adapter\DoctrineORMAdapter; | 6 | use Pagerfanta\Adapter\DoctrineORMAdapter; |
6 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; | 7 | use Pagerfanta\Exception\OutOfRangeCurrentPageException; |
7 | use Pagerfanta\Pagerfanta; | 8 | use Pagerfanta\Pagerfanta; |
@@ -15,6 +16,7 @@ use Wallabag\GroupBundle\Entity\Group; | |||
15 | use Wallabag\GroupBundle\Entity\UserGroup; | 16 | use Wallabag\GroupBundle\Entity\UserGroup; |
16 | use Wallabag\GroupBundle\Form\GroupType; | 17 | use Wallabag\GroupBundle\Form\GroupType; |
17 | use Wallabag\GroupBundle\Form\NewGroupType; | 18 | use Wallabag\GroupBundle\Form\NewGroupType; |
19 | use Wallabag\GroupBundle\Form\UserGroupType; | ||
18 | use Wallabag\UserBundle\Entity\User; | 20 | use 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 | ||
3 | namespace Wallabag\GroupBundle\Form\Type; | 3 | namespace Wallabag\GroupBundle\Form; |
4 | 4 | ||
5 | use Wallabag\GroupBundle\Entity\Group; | 5 | use Wallabag\GroupBundle\Entity\Group; |
6 | use Symfony\Component\Form\AbstractType; | 6 | use 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 @@ | |||
1 | services: | 1 | services: |
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 %} | ||