<?php
/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);
namespace Ibexa\Bundle\Shipping\EventSubscriber;
use Ibexa\AdminUi\Menu\Event\ConfigureMenuEvent;
use Ibexa\Contracts\ProductCatalog\PermissionResolverInterface;
use Ibexa\Contracts\Shipping\Shipment\Permission\View as ShipmentView;
use Ibexa\Contracts\Shipping\ShippingMethod\Permission\View;
use JMS\TranslationBundle\Model\Message;
use JMS\TranslationBundle\Translation\TranslationContainerInterface;
use Knp\Menu\ItemInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
final class MainMenuSubscriber implements EventSubscriberInterface, TranslationContainerInterface
{
public const ITEM_COMMERCE = 'main__commerce';
public const ITEM_SHIPPING_METHODS = 'main__commerce__shipping_methods';
public const ITEM_SHIPMENTS = 'main__commerce__shipments';
public const ITEM_COMMERCE_GROUP_SETTINGS = 'main__commerce__group_settings';
private PermissionResolverInterface $permissionResolver;
public function __construct(
PermissionResolverInterface $permissionResolver
) {
$this->permissionResolver = $permissionResolver;
}
public static function getSubscribedEvents(): array
{
return [
ConfigureMenuEvent::MAIN_MENU => ['onConfigureMainMenu', 5],
];
}
public function onConfigureMainMenu(ConfigureMenuEvent $event): void
{
$menu = $event->getMenu();
$root = $menu->getChild(self::ITEM_COMMERCE);
if ($root === null) {
$root = $this->addCommerceMenu($menu);
}
if ($this->canViewShipments()) {
$root->addChild(
self::ITEM_SHIPMENTS,
[
'route' => 'ibexa.shipping.shipment.list',
'extras' => [
'orderNumber' => 30,
'routes' => [
[
'pattern' => '~^ibexa\.shipping\.shipment\.~',
],
],
],
]
);
}
if ($this->canViewShippingMethods()) {
$groupSettingsRoot = $this->getGroupSettingsRoot($root);
$groupSettingsRoot->addChild(
self::ITEM_SHIPPING_METHODS,
[
'route' => 'ibexa.shipping.shipping_method.list',
'extras' => [
'orderNumber' => 130,
'routes' => [
[
'pattern' => '~^ibexa\.shipping\.shipping_method\.~',
],
],
],
]
);
}
}
public static function getTranslationMessages(): array
{
return [
(new Message(self::ITEM_COMMERCE, 'ibexa_menu'))->setDesc('Commerce'),
(new Message(self::ITEM_SHIPPING_METHODS, 'ibexa_menu'))->setDesc('Shipping methods'),
(new Message(self::ITEM_SHIPMENTS, 'ibexa_menu'))->setDesc('Shipments'),
(new Message(self::ITEM_COMMERCE_GROUP_SETTINGS, 'ibexa_menu'))->setDesc('Settings'),
];
}
private function addCommerceMenu(ItemInterface $menu): ItemInterface
{
return $menu->addChild(
self::ITEM_COMMERCE,
[
'attributes' => [
'data-tooltip-placement' => 'right',
'data-tooltip-extra-class' => 'ibexa-tooltip--navigation',
],
'extras' => [
'icon' => 'cart-full',
'orderNumber' => 100,
],
]
);
}
private function canViewShippingMethods(): bool
{
return $this->permissionResolver->canUser(new View());
}
private function canViewShipments(): bool
{
return $this->permissionResolver->canUser(new ShipmentView());
}
private function getGroupSettingsRoot(ItemInterface $menu): ItemInterface
{
$groupSettingsRoot = $menu->getChild(self::ITEM_COMMERCE_GROUP_SETTINGS);
if ($groupSettingsRoot === null) {
$groupSettingsRoot = $menu->addChild(
self::ITEM_COMMERCE_GROUP_SETTINGS,
[
'extras' => [
'orderNumber' => 100,
],
],
);
}
return $groupSettingsRoot;
}
}