Feat user list (#674)

* add group count column in users & places lists

* add export button for products pages

---------

Co-authored-by: Sarahshr <sarah@les-tilleuls.coop>
This commit is contained in:
Sarahshr 2024-01-05 11:09:32 +01:00 committed by Slim
parent f88fa2ef00
commit 9f661ebe0a
5 changed files with 54 additions and 3 deletions

View file

@ -15,6 +15,7 @@ use App\Enum\Product\ProductType;
use App\Enum\Product\ProductVisibility; use App\Enum\Product\ProductVisibility;
use App\Flysystem\EasyAdminHelper; use App\Flysystem\EasyAdminHelper;
use App\Flysystem\MediaManager; use App\Flysystem\MediaManager;
use App\Helper\CsvExporter;
use App\Repository\CategoryRepository; use App\Repository\CategoryRepository;
use App\Repository\ProductRepository; use App\Repository\ProductRepository;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
@ -27,8 +28,10 @@ use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext; use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface; use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Dto\CrudDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto; use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto; use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
use EasyCorp\Bundle\EasyAdminBundle\Factory\FilterFactory;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField; use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField; 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\Form\Extension\Core\Type\EnumType;
use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\String\Slugger\SluggerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
abstract class AbstractProductCrudController extends AbstractCrudController implements AdminSecuredCrudControllerInterface abstract class AbstractProductCrudController extends AbstractCrudController implements AdminSecuredCrudControllerInterface
{ {
@ -65,6 +70,10 @@ abstract class AbstractProductCrudController extends AbstractCrudController impl
private readonly MediaManager $mediaManager, private readonly MediaManager $mediaManager,
#[Autowire('%product_base_path%')] #[Autowire('%product_base_path%')]
private readonly string $productBasePath, 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') $availability = Action::new('availability', 'action.availability')
->linkToCrudAction('linkToProductAvailabilityPage'); ->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 return $actions
->add(Crud::PAGE_INDEX, Action::DETAIL) ->add(Crud::PAGE_INDEX, Action::DETAIL)
->add(Crud::PAGE_EDIT, Action::DETAIL) ->add(Crud::PAGE_EDIT, Action::DETAIL)
->add(Crud::PAGE_EDIT, Action::INDEX) ->add(Crud::PAGE_EDIT, Action::INDEX)
->add(Crud::PAGE_INDEX, $onBreak) ->add(Crud::PAGE_INDEX, $onBreak)
->add(Crud::PAGE_INDEX, $activate) ->add(Crud::PAGE_INDEX, $activate)
->add(Crud::PAGE_DETAIL, $availability); ->add(Crud::PAGE_DETAIL, $availability)
->add(Crud::PAGE_INDEX, $exportAction);
} }
private function redirectToObjectCrudPage(): RedirectResponse private function redirectToObjectCrudPage(): RedirectResponse
@ -147,6 +172,23 @@ abstract class AbstractProductCrudController extends AbstractCrudController impl
return $this->redirectToObjectCrudPage(); 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 public static function getEntityFqcn(): string
{ {
return Product::class; return Product::class;

View file

@ -354,6 +354,7 @@ abstract class AbstractUserCrudController extends AbstractCrudController impleme
$smsNotificationsField = BooleanField::new('smsNotifications'); $smsNotificationsField = BooleanField::new('smsNotifications');
$vacationModeField = BooleanField::new('vacationMode'); $vacationModeField = BooleanField::new('vacationMode');
$addressField = AssociationField::new('address'); $addressField = AssociationField::new('address');
$groupsCountField = AssociationField::new('userGroups')->setLabel('Groups number');
return compact( return compact(
'idField', 'idField',
@ -376,6 +377,7 @@ abstract class AbstractUserCrudController extends AbstractCrudController impleme
'smsNotificationsField', 'smsNotificationsField',
'vacationModeField', 'vacationModeField',
'addressField', 'addressField',
'groupsCountField',
); );
} }

View file

@ -45,10 +45,11 @@ final class PlaceCrudController extends AbstractUserCrudController
'loginAt' => $loginAt, 'loginAt' => $loginAt,
'createdAt' => $createdAt, 'createdAt' => $createdAt,
'updatedAt' => $updatedAt, 'updatedAt' => $updatedAt,
'groupsCountField' => $groupsCountField,
] = $this->getFields($pageName); ] = $this->getFields($pageName);
if ($pageName === Crud::PAGE_INDEX) { 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) { if ($pageName === Crud::PAGE_NEW || $pageName === Crud::PAGE_EDIT) {

View file

@ -47,10 +47,11 @@ final class UserCrudController extends AbstractUserCrudController
'smsNotificationsField' => $smsNotificationsField, 'smsNotificationsField' => $smsNotificationsField,
'vacationModeField' => $vacationModeField, 'vacationModeField' => $vacationModeField,
'addressField' => $addressField, 'addressField' => $addressField,
'groupsCountField' => $groupsCountField,
] = $this->getFields($pageName); ] = $this->getFields($pageName);
if ($pageName === Crud::PAGE_INDEX) { 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(); $panels = $this->getPanels();

View file

@ -358,6 +358,11 @@
<target>Retour</target> <target>Retour</target>
</trans-unit> </trans-unit>
<trans-unit id="D4hiuPj" resname="Groups number">
<source>Groups number</source>
<target>Nombre de groupes</target>
</trans-unit>
</body> </body>
</file> </file>
</xliff> </xliff>