diff --git a/src/Controller/GroupController.php b/src/Controller/GroupController.php new file mode 100644 index 00000000..4a08d665 --- /dev/null +++ b/src/Controller/GroupController.php @@ -0,0 +1,119 @@ +_edit($entity, $request, $em); + } + + /** + * @Route("/new", name="group_new") + * @Route("/") + * @param Request $request + * @param EntityManagerInterface $em + * @param EntityImporter $importer + * @return Response + */ + public function new(Request $request, EntityManagerInterface $em, EntityImporter $importer) + { + return $this->_new($request, $em, $importer); + } + + /** + * @Route("/{id}", name="group_delete", methods={"DELETE"}) + * @param Request $request + * @param Group $entity + * @param StructuralElementRecursionHelper $recursionHelper + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + public function delete(Request $request, Group $entity, StructuralElementRecursionHelper $recursionHelper) + { + return $this->_delete($request, $entity, $recursionHelper); + } + + /** + * @Route("/export", name="group_export_all") + * @param EntityManagerInterface $em + * @param EntityExporter $exporter + * @param Request $request + * @return Response + */ + public function exportAll(EntityManagerInterface $em, EntityExporter $exporter, Request $request) + { + return $this->_exportAll($em, $exporter, $request); + } + + /** + * @Route("/{id}/export", name="group_export") + * @param Group $entity + * @param EntityExporter $exporter + * @param Request $request + * @return Response + */ + public function exportEntity(Group $entity, EntityExporter $exporter, Request $request) + { + return $this->_exportEntity($entity, $exporter, $request); + } +} \ No newline at end of file diff --git a/src/Form/AdminPages/GroupAdminForm.php b/src/Form/AdminPages/GroupAdminForm.php new file mode 100644 index 00000000..2cf7acbd --- /dev/null +++ b/src/Form/AdminPages/GroupAdminForm.php @@ -0,0 +1,49 @@ +add('permissions', PermissionsType::class, [ + 'mapped' => false, + 'data' => $builder->getData(), + 'disabled' => !$this->security->isGranted('edit_permissions', $entity) + ]); + } +} \ No newline at end of file diff --git a/src/Security/Voter/GroupVoter.php b/src/Security/Voter/GroupVoter.php new file mode 100644 index 00000000..188e3259 --- /dev/null +++ b/src/Security/Voter/GroupVoter.php @@ -0,0 +1,76 @@ +resolver->inherit($user,'groups', $attribute) ?? false; + } + + return false; + } + + /** + * Determines if the attribute and subject are supported by this voter. + * + * @param string $attribute An attribute + * @param mixed $subject The subject to secure, e.g. an object the user wants to access or any other PHP type + * + * @return bool True if the attribute and subject are supported, false otherwise + */ + protected function supports($attribute, $subject) + { + if ($subject instanceof Group) { + return $this->resolver->isValidOperation('groups', $attribute); + } + + return false; + } +} \ No newline at end of file diff --git a/src/Services/EntityURLGenerator.php b/src/Services/EntityURLGenerator.php index a9ef1eb8..ef568b87 100644 --- a/src/Services/EntityURLGenerator.php +++ b/src/Services/EntityURLGenerator.php @@ -42,6 +42,7 @@ use App\Entity\Parts\Part; use App\Entity\Parts\Storelocation; use App\Entity\Parts\Supplier; use App\Entity\PriceInformations\Currency; +use App\Entity\UserSystem\Group; use App\Entity\UserSystem\User; use App\Exceptions\EntityNotSupported; use Symfony\Component\HttpKernel\HttpCache\Store; @@ -196,7 +197,8 @@ class EntityURLGenerator Footprint::class => 'footprint_edit', User::class => 'user_edit', Currency::class => 'currency_edit', - MeasurementUnit::class => 'measurement_unit_edit' + MeasurementUnit::class => 'measurement_unit_edit', + Group::class => 'group_edit' ]; return $this->urlGenerator->generate($this->mapToController($map, $entity), ['id' => $entity->getID()]); @@ -222,7 +224,8 @@ class EntityURLGenerator Footprint::class => 'footprint_new', User::class => 'user_new', Currency::class => 'currency_new', - MeasurementUnit::class => 'measurement_unit_new' + MeasurementUnit::class => 'measurement_unit_new', + Group::class => 'group_new' ]; return $this->urlGenerator->generate($this->mapToController($map, $entity)); @@ -278,7 +281,8 @@ class EntityURLGenerator Footprint::class => 'footprint_delete', User::class => 'user_delete', Currency::class => 'currency_delete', - MeasurementUnit::class => 'measurement_unit_delete' + MeasurementUnit::class => 'measurement_unit_delete', + Group::class => 'group_delete' ]; return $this->urlGenerator->generate($this->mapToController($map, $entity), ['id' => $entity->getID()]); diff --git a/src/Services/ToolsTreeBuilder.php b/src/Services/ToolsTreeBuilder.php index bfc7e414..c09a3175 100644 --- a/src/Services/ToolsTreeBuilder.php +++ b/src/Services/ToolsTreeBuilder.php @@ -136,12 +136,16 @@ class ToolsTreeBuilder */ protected function getSystemNodes() : array { - $edit_nodes = array(); + $nodes = array(); - $edit_nodes[] = new TreeViewNode($this->translator->trans('tree.tools.system.users'), + $nodes[] = new TreeViewNode($this->translator->trans('tree.tools.system.users'), $this->urlGenerator->generate("user_new") ); - return $edit_nodes; + $nodes[] = new TreeViewNode($this->translator->trans('tree.tools.system.groups'), + $this->urlGenerator->generate('group_new') + ); + + return $nodes; } } diff --git a/templates/AdminPages/GroupAdmin.html.twig b/templates/AdminPages/GroupAdmin.html.twig new file mode 100644 index 00000000..7b06632a --- /dev/null +++ b/templates/AdminPages/GroupAdmin.html.twig @@ -0,0 +1,17 @@ +{% extends "AdminPages/EntityAdminBase.html.twig" %} + +{% block card_title %} + {% trans %}group.edit.caption{% endtrans %} +{% endblock %} + + +{% block additional_pills %} + +{% endblock %} + + +{% block additional_panes %} +
+ {{ form_row(form.permissions) }} +
+{% endblock %} \ No newline at end of file