diff --git a/app/Entity/Book.php b/app/Entity/Book.php index 30b6781f8..e96b92831 100644 --- a/app/Entity/Book.php +++ b/app/Entity/Book.php @@ -13,6 +13,8 @@ namespace App\Entity; +use App\Enum\BookCategory; +use App\Form\BookType; use App\Grid\BookGrid; use App\Repository\BookRepository; use App\Responder\ExportGridToCsvResponder; @@ -31,6 +33,7 @@ #[ORM\Entity(repositoryClass: BookRepository::class)] #[AsResource( section: 'admin', + formType: BookType::class, templatesDir: '@SyliusAdminUi/crud', routePrefix: '/admin', operations: [ @@ -54,6 +57,7 @@ #[SyliusCrudRoutes( alias: 'app.book', path: '/admin/legacy/books', + form: BookType::class, section: 'admin_legacy', redirect: 'update', templates: '@SyliusAdminUi/crud', @@ -79,6 +83,9 @@ class Book implements ResourceInterface #[NotBlank] private ?string $authorName = null; + #[ORM\Column(type: 'enum', length: 255, nullable: true)] + private ?BookCategory $category = null; + #[ORM\Column(type: 'datetime_immutable')] private \DateTimeImmutable $createdAt; @@ -121,4 +128,14 @@ public function setCreatedAt(\DateTimeImmutable $createdAt): void { $this->createdAt = $createdAt; } + + public function getCategory(): ?BookCategory + { + return $this->category; + } + + public function setCategory(?BookCategory $category): void + { + $this->category = $category; + } } diff --git a/app/Enum/BookCategory.php b/app/Enum/BookCategory.php new file mode 100644 index 000000000..4609039d6 --- /dev/null +++ b/app/Enum/BookCategory.php @@ -0,0 +1,42 @@ +with(['authorName' => $authorName]); } + public function withCategory(BookCategory $category): self + { + return $this->with(['category' => $category]); + } + protected function defaults(): array|callable { return [ 'title' => ucfirst(self::faker()->words(3, true)), 'authorName' => self::faker()->firstName() . ' ' . self::faker()->lastName(), + 'category' => self::faker()->randomElement(BookCategory::cases()), ]; } } diff --git a/app/Form/BookType.php b/app/Form/BookType.php new file mode 100644 index 000000000..5c7cef9ae --- /dev/null +++ b/app/Form/BookType.php @@ -0,0 +1,50 @@ +add('title') + ->add('authorName') + ->add('category', EnumType::class, [ + 'class' => BookCategory::class, + 'choice_value' => fn (?BookCategory $enum) => $enum?->value, + 'choice_label' => fn (BookCategory $choice) => ucfirst($choice->value), + 'required' => false, + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Book::class, + ]); + } + + public function getBlockPrefix(): string + { + return 'sylius_resource'; + } +} diff --git a/app/Grid/BookGrid.php b/app/Grid/BookGrid.php index 1efada35e..2a7ce2880 100644 --- a/app/Grid/BookGrid.php +++ b/app/Grid/BookGrid.php @@ -14,6 +14,7 @@ namespace App\Grid; use App\Entity\Book; +use App\Enum\BookCategory; use Sylius\Bundle\GridBundle\Builder\Action\Action; use Sylius\Bundle\GridBundle\Builder\Action\CreateAction; use Sylius\Bundle\GridBundle\Builder\Action\DeleteAction; @@ -22,36 +23,42 @@ use Sylius\Bundle\GridBundle\Builder\ActionGroup\BulkActionGroup; use Sylius\Bundle\GridBundle\Builder\ActionGroup\ItemActionGroup; use Sylius\Bundle\GridBundle\Builder\ActionGroup\MainActionGroup; +use Sylius\Bundle\GridBundle\Builder\Field\EnumField; use Sylius\Bundle\GridBundle\Builder\Field\StringField; +use Sylius\Bundle\GridBundle\Builder\Filter\EnumFilter; use Sylius\Bundle\GridBundle\Builder\Filter\StringFilter; use Sylius\Bundle\GridBundle\Builder\GridBuilderInterface; use Sylius\Bundle\GridBundle\Grid\AbstractGrid; -use Sylius\Bundle\GridBundle\Grid\ResourceAwareGridInterface; +use Sylius\Component\Grid\Attribute\AsGrid; -final class BookGrid extends AbstractGrid implements ResourceAwareGridInterface +#[AsGrid( + resourceClass: Book::class, + name: 'app_book', +)] +final class BookGrid extends AbstractGrid { - public static function getName(): string - { - return 'app_book'; - } - - public function buildGrid(GridBuilderInterface $gridBuilder): void + public function __invoke(GridBuilderInterface $gridBuilder): void { $gridBuilder ->orderBy('title') - ->addFilter( + ->withFilters( StringFilter::create('search', ['title', 'authorName']) ->setLabel('sylius.ui.search'), + EnumFilter::create(name: 'category', enumClass: BookCategory::class, field: 'category') + ->addFormOption('choice_value', fn (?BookCategory $enum) => $enum?->value) + ->addFormOption('choice_label', fn (BookCategory $choice) => ucfirst($choice->value)) + ->setLabel('app.ui.category'), ) - ->addField( + ->withFields( StringField::create('title') ->setLabel('app.ui.title') ->setSortable(true), - ) - ->addField( StringField::create('authorName') ->setLabel('app.ui.author_name') ->setSortable(true), + EnumField::create('category') + ->setLabel('app.ui.category') + ->setSortable(true), ) ->addActionGroup( MainActionGroup::create( @@ -78,9 +85,4 @@ public function buildGrid(GridBuilderInterface $gridBuilder): void ) ; } - - public function getResourceClass(): string - { - return Book::class; - } } diff --git a/src/BootstrapAdminUi/config/app/grid/templates.php b/src/BootstrapAdminUi/config/app/grid/templates.php index 5e9a15b11..a10ef3591 100644 --- a/src/BootstrapAdminUi/config/app/grid/templates.php +++ b/src/BootstrapAdminUi/config/app/grid/templates.php @@ -32,6 +32,7 @@ 'exists' => '@SyliusBootstrapAdminUi/shared/grid/filter/exists.html.twig', 'select' => '@SyliusBootstrapAdminUi/shared/grid/filter/select.html.twig', 'string' => '@SyliusBootstrapAdminUi/shared/grid/filter/string.html.twig', + 'enum' => '@SyliusBootstrapAdminUi/shared/grid/filter/enum.html.twig', ], ], ]); diff --git a/src/BootstrapAdminUi/templates/shared/grid/filter/enum.html.twig b/src/BootstrapAdminUi/templates/shared/grid/filter/enum.html.twig new file mode 100644 index 000000000..d308c68b0 --- /dev/null +++ b/src/BootstrapAdminUi/templates/shared/grid/filter/enum.html.twig @@ -0,0 +1,3 @@ +{% form_theme form '@SyliusBootstrapAdminUi/shared/form_theme.html.twig' %} + +{{ form_row(form, { 'label': filter.label}) }} diff --git a/templates/book/show/content/page_body.html.twig b/templates/book/show/content/page_body.html.twig index ce6eb7c4a..26076fdb9 100644 --- a/templates/book/show/content/page_body.html.twig +++ b/templates/book/show/content/page_body.html.twig @@ -4,8 +4,8 @@
{{ 'app.ui.author'|trans }}: {{ book.authorName }}
+{{ 'app.ui.category'|trans }}:{{ book.category.value }}