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:
parent
f88fa2ef00
commit
9f661ebe0a
5 changed files with 54 additions and 3 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue