vendor/ibexa/scheduler/src/lib/Menu/ConfigureRightMenuSidebarListener.php line 67

Open in your IDE?
  1. <?php
  2. /**
  3.  * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4.  * @license For full copyright and license information view LICENSE file distributed with this source code.
  5.  */
  6. declare(strict_types=1);
  7. namespace Ibexa\Scheduler\Menu;
  8. use Ibexa\AdminUi\Menu\ContentRightSidebarBuilder;
  9. use Ibexa\AdminUi\Menu\Event\ConfigureMenuEvent;
  10. use Ibexa\Contracts\Core\Limitation\Target;
  11. use Ibexa\Contracts\Core\Repository\PermissionResolver;
  12. use Ibexa\Contracts\Core\Repository\UserService;
  13. use Ibexa\Contracts\Core\Repository\Values\Content\Content;
  14. use Ibexa\Contracts\Core\Repository\Values\Content\Location;
  15. use Ibexa\Contracts\Scheduler\Repository\DateBasedHideServiceInterface;
  16. use Ibexa\Scheduler\Form\Data\DateBasedHideData;
  17. use Ibexa\Scheduler\Form\Type\DateBasedHideType;
  18. use JMS\TranslationBundle\Model\Message;
  19. use JMS\TranslationBundle\Translation\TranslationContainerInterface;
  20. use Knp\Menu\ItemInterface;
  21. use Knp\Menu\MenuItem;
  22. use Symfony\Component\Form\FormFactoryInterface;
  23. use Symfony\Component\Form\FormView;
  24. use Symfony\Component\Form\Util\StringUtil;
  25. use Symfony\Contracts\Translation\TranslatorInterface;
  26. final class ConfigureRightMenuSidebarListener implements TranslationContainerInterface
  27. {
  28.     public const ITEM__HIDE 'content__sidebar_right__schedule_hide';
  29.     /** @var \Symfony\Contracts\Translation\TranslatorInterface */
  30.     private $translator;
  31.     /** @var \Symfony\Component\Form\FormFactoryInterface */
  32.     private $formFactory;
  33.     /** @var \Ibexa\Contracts\Scheduler\Repository\DateBasedHideServiceInterface */
  34.     private $dateBasedHideService;
  35.     /** @var \Ibexa\Contracts\Core\Repository\UserService */
  36.     private $userService;
  37.     private PermissionResolver $permissionResolver;
  38.     public function __construct(
  39.         TranslatorInterface $translator,
  40.         FormFactoryInterface $formFactory,
  41.         DateBasedHideServiceInterface $dateBasedHideService,
  42.         UserService $userService,
  43.         PermissionResolver $permissionResolver
  44.     ) {
  45.         $this->translator $translator;
  46.         $this->formFactory $formFactory;
  47.         $this->dateBasedHideService $dateBasedHideService;
  48.         $this->userService $userService;
  49.         $this->permissionResolver $permissionResolver;
  50.     }
  51.     /**
  52.      * @throws \InvalidArgumentException
  53.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\BadStateException
  54.      * @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException
  55.      */
  56.     public function onAdminUiMenuConfigure(ConfigureMenuEvent $event): void
  57.     {
  58.         $options $event->getOptions();
  59.         /** @var \Ibexa\Contracts\Core\Repository\Values\Content\Content $content */
  60.         $content $options['content'];
  61.         if ($this->userService->isUser($content) || $this->userService->isUserGroup($content)) {
  62.             return;
  63.         }
  64.         /** @var \Ibexa\Contracts\Core\Repository\Values\Content\Location $location */
  65.         $location $options['location'];
  66.         if ($this->dateBasedHideService->isScheduledHide($content->id)) {
  67.             $scheduledEntry $this->dateBasedHideService->getScheduledHide($content->id);
  68.             $timestamp $scheduledEntry->date->getTimestamp();
  69.         }
  70.         $formView $this->createFormView($location$content$timestamp ?? null);
  71.         $translations $content->getVersionInfo()->languageCodes;
  72.         $target = (new Target\Version())->deleteTranslations($translations);
  73.         $canHide $this->permissionResolver->canUser(
  74.             'content',
  75.             'hide',
  76.             $content,
  77.             [$target]
  78.         );
  79.         $root $event->getMenu();
  80.         if (!$content->contentInfo->isHidden) {
  81.             $root->addChild(
  82.                 self::ITEM__HIDE,
  83.                 [
  84.                     'extras' => [
  85.                         'orderNumber' => 60,
  86.                         'translation_domain' => 'ibexa_menu',
  87.                         'template' => '@IbexaScheduler/schedule_hide_widget.html.twig',
  88.                         'template_parameters' => [
  89.                             'form_date_based_hide' => $formView,
  90.                         ],
  91.                     ],
  92.                     'attributes' => [
  93.                         'class' => 'ibexa-btn--schedule-hide ibexa-btn--extra-actions',
  94.                         'data-actions' => 'schedule-hide',
  95.                         'data-focus-element' => '.form-check-input',
  96.                         'disabled' => $content->contentInfo->isHidden || !$canHide,
  97.                     ],
  98.                 ]
  99.             );
  100.         }
  101.         $root->removeChild(ContentRightSidebarBuilder::ITEM__HIDE);
  102.         $this->reorderChildren($root);
  103.     }
  104.     /**
  105.      * @return \JMS\TranslationBundle\Model\Message[]
  106.      */
  107.     public static function getTranslationMessages(): array
  108.     {
  109.         return [
  110.             (new Message(self::ITEM__HIDE'ibexa_menu'))->setDesc('Hide'),
  111.         ];
  112.     }
  113.     private function reorderChildren(ItemInterface $menuRootItem): void
  114.     {
  115.         $children $menuRootItem->getChildren();
  116.         uasort($children, static function (MenuItem $aMenuItem $b) {
  117.             return $a->getExtra('orderNumber') <=> $b->getExtra('orderNumber');
  118.         });
  119.         $menuRootItem->reorderChildren(array_keys($children));
  120.     }
  121.     private function createFormView(
  122.         Location $location,
  123.         Content $content,
  124.         ?int $timestamp
  125.     ): FormView {
  126.         $fqcnToBlockPrefix StringUtil::fqcnToBlockPrefix(DateBasedHideType::class);
  127.         $dateBasedHideData = new DateBasedHideData(
  128.             $location,
  129.             $content->versionInfo,
  130.             $timestamp
  131.         );
  132.         return $this->formFactory->createNamed(
  133.             $fqcnToBlockPrefix,
  134.             DateBasedHideType::class,
  135.             $dateBasedHideData
  136.         )->createView();
  137.     }
  138. }
  139. class_alias(ConfigureRightMenuSidebarListener::class, 'EzSystems\DateBasedPublisher\Core\Menu\ConfigureRightMenuSidebarListener');