From 9f661ebe0a079b82fde997102ce514699c0fa75d Mon Sep 17 00:00:00 2001 From: Sarahshr <51380592+Sarahshr@users.noreply.github.com> Date: Fri, 5 Jan 2024 11:09:32 +0100 Subject: [PATCH] Feat user list (#674) * add group count column in users & places lists * add export button for products pages --------- Co-authored-by: Sarahshr --- .../Admin/AbstractProductCrudController.php | 44 ++++++++++++++++++- .../Admin/AbstractUserCrudController.php | 2 + src/Controller/Admin/PlaceCrudController.php | 3 +- src/Controller/Admin/UserCrudController.php | 3 +- translations/admin.fr.xlf | 5 +++ 5 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/Controller/Admin/AbstractProductCrudController.php b/src/Controller/Admin/AbstractProductCrudController.php index 8db4bf8..5f0f351 100755 --- a/src/Controller/Admin/AbstractProductCrudController.php +++ b/src/Controller/Admin/AbstractProductCrudController.php @@ -15,6 +15,7 @@ use App\Enum\Product\ProductType; use App\Enum\Product\ProductVisibility; use App\Flysystem\EasyAdminHelper; use App\Flysystem\MediaManager; +use App\Helper\CsvExporter; use App\Repository\CategoryRepository; use App\Repository\ProductRepository; use Doctrine\ORM\QueryBuilder; @@ -27,8 +28,10 @@ use EasyCorp\Bundle\EasyAdminBundle\Config\Filters; use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext; use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; +use EasyCorp\Bundle\EasyAdminBundle\Dto\CrudDto; use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto; use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto; +use EasyCorp\Bundle\EasyAdminBundle\Factory\FilterFactory; use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField; use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField; @@ -45,6 +48,8 @@ use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\Form\Extension\Core\Type\EnumType; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\String\Slugger\SluggerInterface; +use Symfony\Contracts\Translation\TranslatorInterface; abstract class AbstractProductCrudController extends AbstractCrudController implements AdminSecuredCrudControllerInterface { @@ -65,6 +70,10 @@ abstract class AbstractProductCrudController extends AbstractCrudController impl private readonly MediaManager $mediaManager, #[Autowire('%product_base_path%')] private readonly string $productBasePath, + private readonly CsvExporter $csvExporter, + private readonly TranslatorInterface $translator, + private readonly FilterFactory $filterFactory, + private readonly SluggerInterface $slugger, ) { } @@ -112,13 +121,29 @@ abstract class AbstractProductCrudController extends AbstractCrudController impl $availability = Action::new('availability', 'action.availability') ->linkToCrudAction('linkToProductAvailabilityPage'); + $exportAction = Action::new('export') + ->linkToUrl(function () { + /** @var AdminContext $context */ + $context = $this->getContext(); + + return $this->adminUrlGenerator->setAll($context->getRequest()->query->all()) + ->setEntityId(null) + ->setAction('export') + ->generateUrl(); + }) + ->addCssClass('btn btn-success') + ->setIcon('fa fa-download') + ->createAsGlobalAction() + ; + return $actions ->add(Crud::PAGE_INDEX, Action::DETAIL) ->add(Crud::PAGE_EDIT, Action::DETAIL) ->add(Crud::PAGE_EDIT, Action::INDEX) ->add(Crud::PAGE_INDEX, $onBreak) ->add(Crud::PAGE_INDEX, $activate) - ->add(Crud::PAGE_DETAIL, $availability); + ->add(Crud::PAGE_DETAIL, $availability) + ->add(Crud::PAGE_INDEX, $exportAction); } private function redirectToObjectCrudPage(): RedirectResponse @@ -147,6 +172,23 @@ abstract class AbstractProductCrudController extends AbstractCrudController impl return $this->redirectToObjectCrudPage(); } + /** + * For now, we export exactly what we see in the list to avoid security problems. + */ + public function export(AdminContext $context): Response + { + $fields = FieldCollection::new($this->configureFields(Crud::PAGE_INDEX)); + /** @var CrudDto $crud Crud is defined here */ + $crud = $context->getCrud(); + $filters = $this->filterFactory->create($crud->getFiltersConfig(), $fields, $context->getEntity()); + /** @var SearchDto $search */ + $search = $context->getSearch(); + $queryBuilder = $this->createIndexQueryBuilder($search, $context->getEntity(), $fields, $filters); + $fileName = $this->slugger->slug($this->translator->trans($this->getEntityLabelInPlural(), [], DashboardController::DOMAIN)); + + return $this->csvExporter->createResponseFromQueryBuilder($queryBuilder, $fields, $fileName.'.csv'); + } + public static function getEntityFqcn(): string { return Product::class; diff --git a/src/Controller/Admin/AbstractUserCrudController.php b/src/Controller/Admin/AbstractUserCrudController.php index c914d39..1943880 100755 --- a/src/Controller/Admin/AbstractUserCrudController.php +++ b/src/Controller/Admin/AbstractUserCrudController.php @@ -354,6 +354,7 @@ abstract class AbstractUserCrudController extends AbstractCrudController impleme $smsNotificationsField = BooleanField::new('smsNotifications'); $vacationModeField = BooleanField::new('vacationMode'); $addressField = AssociationField::new('address'); + $groupsCountField = AssociationField::new('userGroups')->setLabel('Groups number'); return compact( 'idField', @@ -376,6 +377,7 @@ abstract class AbstractUserCrudController extends AbstractCrudController impleme 'smsNotificationsField', 'vacationModeField', 'addressField', + 'groupsCountField', ); } diff --git a/src/Controller/Admin/PlaceCrudController.php b/src/Controller/Admin/PlaceCrudController.php index 74be36f..58c22c3 100755 --- a/src/Controller/Admin/PlaceCrudController.php +++ b/src/Controller/Admin/PlaceCrudController.php @@ -45,10 +45,11 @@ final class PlaceCrudController extends AbstractUserCrudController 'loginAt' => $loginAt, 'createdAt' => $createdAt, 'updatedAt' => $updatedAt, + 'groupsCountField' => $groupsCountField, ] = $this->getFields($pageName); if ($pageName === Crud::PAGE_INDEX) { - return [$emailField, $nameField, $enabledField, $emailConfirmedField, $createdAt, $updatedAt, $loginAt]; + return [$emailField, $nameField, $enabledField, $emailConfirmedField, $createdAt, $updatedAt, $loginAt, $groupsCountField]; } if ($pageName === Crud::PAGE_NEW || $pageName === Crud::PAGE_EDIT) { diff --git a/src/Controller/Admin/UserCrudController.php b/src/Controller/Admin/UserCrudController.php index b8ddff9..376aae5 100755 --- a/src/Controller/Admin/UserCrudController.php +++ b/src/Controller/Admin/UserCrudController.php @@ -47,10 +47,11 @@ final class UserCrudController extends AbstractUserCrudController 'smsNotificationsField' => $smsNotificationsField, 'vacationModeField' => $vacationModeField, 'addressField' => $addressField, + 'groupsCountField' => $groupsCountField, ] = $this->getFields($pageName); if ($pageName === Crud::PAGE_INDEX) { - return [$emailField, $firstNameField, $lastNameField, $enabledField, $emailConfirmedField, $avatarField, $createdAt, $updatedAt, $loginAt]; + return [$emailField, $firstNameField, $lastNameField, $enabledField, $emailConfirmedField, $avatarField, $createdAt, $updatedAt, $loginAt, $groupsCountField]; } $panels = $this->getPanels(); diff --git a/translations/admin.fr.xlf b/translations/admin.fr.xlf index 7e4880a..cbd466e 100644 --- a/translations/admin.fr.xlf +++ b/translations/admin.fr.xlf @@ -358,6 +358,11 @@ Retour + + Groups number + Nombre de groupes + +