<?php
namespace App\Controller\Admin;
use App\Controller\Admin\Filter\VinFilter;
use App\Entity\Report;
use App\Message\LoadSourceReportMessage;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextareaField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Serializer\SerializerInterface;
use function Symfony\Component\Translation\t;
class ReportCrudController extends AbstractCrudController
{
public function __construct(private AdminUrlGenerator $adminUrlGenerator, private SerializerInterface $serializer)
{
}
public static function getEntityFqcn(): string
{
return Report::class;
}
public function configureFields(string $pageName): iterable
{
yield IdField::new('id')->setDisabled();
yield AssociationField::new('order')->setDisabled();
yield TextField::new('order.vin')->setSortable(true)->setDisabled()->setLabel('VIN');
yield DateTimeField::new('order.createdAt')->setSortable(true)->setDisabled()->setLabel('Дата');
yield AssociationField::new('reportType');
yield IntegerField::new('price');
yield BooleanField::new('handled');
yield BooleanField::new('loaded');
yield TextareaField::new('content')->onlyOnForms();
}
public function configureFilters(Filters $filters): Filters
{
return $filters
->add('reportType')
->add('price')
->add('handled')
->add('loaded')
->add('order')
->add(VinFilter::new('vin'))
;
}
public function configureCrud(Crud $crud): Crud
{
return $crud
->setDefaultSort(['order.createdAt' => 'DESC'])
;
}
public function configureActions(Actions $actions): Actions
{
return $actions
->add(
Crud::PAGE_INDEX,
Action::new('loadReport', t('Load report'), 'fas fa-download')
->linkToCrudAction('loadReport')
->displayIf(static function (Report $entity) {
return !$entity->getLoaded();
})
);
}
public function loadReport(AdminContext $context, MessageBusInterface $bus)
{
$report = $context->getEntity()->getInstance();
$bus->dispatch(new LoadSourceReportMessage($report->getReportType()->getName() ?? 'unknownType', (string) $report->getId(), $report->getOrder()->getVin()->getVin()));
if ($context->getRequest()->isXmlHttpRequest()) {
new JsonResponse($this->serializer->serialize(['report' => $report], 'json', ['groups' => 'index']));
}
$url = $this->adminUrlGenerator
->setController(static::class)
->setAction(Action::INDEX)
->generateUrl();
return $this->redirect($url);
}
}