91 lines
3.3 KiB
PHP
91 lines
3.3 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
namespace App\Infrastructure\Http\Controller\Admin;
|
||
|
|
|
||
|
|
use App\Application\Article\ArticleService;
|
||
|
|
use App\Domain\Article\Article;
|
||
|
|
use App\Domain\Article\ArticleCondition;
|
||
|
|
use App\Domain\Article\ArticleStatus;
|
||
|
|
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
|
||
|
|
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
|
||
|
|
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
|
||
|
|
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
|
||
|
|
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
|
||
|
|
use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
|
||
|
|
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
|
||
|
|
use EasyCorp\Bundle\EasyAdminBundle\Field\MoneyField;
|
||
|
|
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
|
||
|
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||
|
|
use Symfony\Component\HttpFoundation\Request;
|
||
|
|
use Symfony\Component\Routing\Attribute\Route;
|
||
|
|
use Symfony\Component\Uid\Uuid;
|
||
|
|
|
||
|
|
/** @extends AbstractCrudController<Article> */
|
||
|
|
final class ArticleCrudController extends AbstractCrudController
|
||
|
|
{
|
||
|
|
public function __construct(private readonly ArticleService $articleService)
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
public static function getEntityFqcn(): string
|
||
|
|
{
|
||
|
|
return Article::class;
|
||
|
|
}
|
||
|
|
|
||
|
|
public function configureCrud(Crud $crud): Crud
|
||
|
|
{
|
||
|
|
return $crud->setEntityLabelInSingular('Article')->setEntityLabelInPlural('Articles');
|
||
|
|
}
|
||
|
|
|
||
|
|
public function configureActions(Actions $actions): Actions
|
||
|
|
{
|
||
|
|
$activate = Action::new('activate', 'Activate')
|
||
|
|
->linkToRoute('admin_article_activate', static fn (Article $a) => ['id' => $a->getId()->toRfc4122()])
|
||
|
|
->displayIf(static fn (Article $a) => ArticleStatus::Draft === $a->getStatus());
|
||
|
|
|
||
|
|
return $actions
|
||
|
|
->add(Crud::PAGE_INDEX, $activate)
|
||
|
|
->disable(Action::NEW, Action::EDIT, Action::DELETE);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function configureFields(string $pageName): iterable
|
||
|
|
{
|
||
|
|
yield IdField::new('id')->hideOnForm();
|
||
|
|
yield TextField::new('sku');
|
||
|
|
yield TextField::new('inventoryNumber', 'Inventory #');
|
||
|
|
yield AssociationField::new('articleType');
|
||
|
|
yield ChoiceField::new('status')->setChoices(
|
||
|
|
array_combine(
|
||
|
|
array_map(static fn ($s) => $s->value, ArticleStatus::cases()),
|
||
|
|
ArticleStatus::cases(),
|
||
|
|
)
|
||
|
|
);
|
||
|
|
yield ChoiceField::new('condition')->setChoices(
|
||
|
|
array_combine(
|
||
|
|
array_map(static fn ($c) => $c->value, ArticleCondition::cases()),
|
||
|
|
ArticleCondition::cases(),
|
||
|
|
)
|
||
|
|
);
|
||
|
|
yield MoneyField::new('listingPrice')->setCurrency('EUR')->setRequired(false);
|
||
|
|
}
|
||
|
|
|
||
|
|
#[Route('/admin/articles/{id}/activate', name: 'admin_article_activate')]
|
||
|
|
public function activateArticle(string $id, Request $request): RedirectResponse
|
||
|
|
{
|
||
|
|
$result = $this->articleService->activate(Uuid::fromString($id));
|
||
|
|
|
||
|
|
if ([] !== $result['missing']) {
|
||
|
|
$this->addFlash('warning', 'Cannot activate: missing attributes: '.implode(', ', $result['missing']));
|
||
|
|
} else {
|
||
|
|
$this->addFlash('success', 'Article activated.');
|
||
|
|
}
|
||
|
|
|
||
|
|
return $this->redirectToRoute('easyadmin', [
|
||
|
|
'crudAction' => 'index',
|
||
|
|
'crudControllerFqcn' => self::class,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
}
|