<?php
namespace App\Controller\Admin;
use App\Entity\Article;
use App\Entity\Center;
use App\Entity\Log;
use App\Entity\PactGroup;
use App\Entity\Reader;
use App\Entity\Service;
use App\Entity\User;
use App\Entity\Warehouse;
use App\Service\Article\ArticleService as ArticleService;
use App\Service\Center\CenterService;
use App\Service\Service\ServiceService;
use App\Service\Warehouse\WarehouseService;
use App\Util\StateOrderWarehouse;
use App\Util\UserRole;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
use EasyCorp\Bundle\EasyAdminBundle\Config\UserMenu;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
abstract class DashboardBaseController extends AbstractDashboardController
{
use UserRole;
use StateOrderWarehouse;
protected TranslatorInterface $translator;
protected AdminUrlGenerator $adminUrlGenerator;
protected CenterService $centerService;
protected WarehouseService $warehouseService;
protected ServiceService $serviceService;
protected ArticleService $articleService;
public function __construct(
TranslatorInterface $translator,
AdminUrlGenerator $adminUrlGenerator,
CenterService $centerService,
WarehouseService $warehouseService,
ServiceService $serviceService,
ArticleService $articleService
) {
$this->translator = $translator;
$this->adminUrlGenerator = $adminUrlGenerator;
$this->centerService = $centerService;
$this->warehouseService = $warehouseService;
$this->serviceService = $serviceService;
$this->articleService = $articleService;
}
public function configureDashboard(): Dashboard
{
return Dashboard::new()
->setTitle('')
->setFaviconPath('images/favicon.png');
}
public function configureAssets(): Assets
{
return Assets::new()
->addCssFile('css/admin.css');
}
public function configureMenuItems(): iterable
{
return [
MenuItem::linktoDashboard('Dashboard', 'fa fa-home'),
MenuItem::subMenu($this->translator->trans('menu.order-warehouse.order'), 'fas fa-pallet')->setSubItems([
MenuItem::linkToUrl($this->translator->trans('menu.order-warehouse.new'), 'fas fa-pallet', $this->getUrlNewOrdersWarehouse($this->pendingStatus)),
MenuItem::linkToUrl($this->translator->trans('menu.order-warehouse.pending'), 'fas fa-hourglass-start', $this->getUrlOrdersWarehouseByState($this->pendingStatus)),
MenuItem::linkToUrl($this->translator->trans('menu.order-warehouse.validated'), 'fas fa-check-circle', $this->getUrlOrdersWarehouseByState($this->validatedStatus)),
MenuItem::linkToUrl($this->translator->trans('menu.order-warehouse.issued'), 'fas fa-share', $this->getUrlOrdersWarehouseByState($this->issuedStatus)),
MenuItem::linkToUrl($this->translator->trans('menu.order-warehouse.processed'), 'fas fa-list', $this->getUrlOrdersWarehouseByState($this->processedStatus)),
MenuItem::linkToUrl($this->translator->trans('menu.order-warehouse.canceled'), 'fas fa-window-close', $this->getUrlOrdersWarehouseByState($this->canceledStatus)),
]),
MenuItem::linkToCrud($this->translator->trans('menu.center'), 'fas fa-hospital', Center::class),
MenuItem::linkToCrud($this->translator->trans('menu.warehouse'), 'fas fa-warehouse', Warehouse::class),
MenuItem::linkToCrud($this->translator->trans('menu.service'), 'fas fa-stethoscope', Service::class),
MenuItem::linkToCrud($this->translator->trans('menu.article'), 'fas fa-syringe', Article::class),
MenuItem::linkToCrud($this->translator->trans('menu.pact'), 'fas fa-handshake', PactGroup::class),
MenuItem::linkToRoute($this->translator->trans('menu.navigation-map'), 'fas fa-sitemap', 'navigation_map'),
MenuItem::subMenu($this->translator->trans('menu.label.title'), 'fa fa-file-alt')->setSubItems([
MenuItem::linkToRoute($this->translator->trans('menu.label.reel'), 'fas fa-dot-circle', 'label_template', ['type' => 'reel'])->setPermission($this->roleAdmin),
MenuItem::linkToRoute($this->translator->trans('menu.label.a4'), 'fas fa-file', 'label_template', ['type' => 'a4'])->setPermission($this->roleAdmin),
]),
MenuItem::subMenu($this->translator->trans('menu.utilities.title'), 'fa fa-file-upload')->setSubItems([
MenuItem::linkToRoute($this->translator->trans('menu.utilities.article-import'), 'fas fa-syringe', 'article_import')->setPermission($this->roleAdmin),
MenuItem::linkToRoute($this->translator->trans('menu.utilities.location-import'), 'fas fa-map-marker-alt', 'location_import')->setPermission($this->roleAdmin),
MenuItem::linkToRoute($this->translator->trans('menu.utilities.pact-import'), 'fas fa-handshake', 'pact_import')->setPermission($this->roleAdmin),
]),
MenuItem::subMenu($this->translator->trans('menu.configuration.title'), 'fa fa-cog')->setSubItems([
MenuItem::linkToCrud($this->translator->trans('menu.configuration.user'), 'fa fa-user', User::class)->setPermission($this->roleSuperAdmin),
MenuItem::linkToRoute($this->translator->trans('menu.configuration.rfid'), 'fas fa-broadcast-tower', 'assign-rfid-location')->setPermission($this->roleService),
MenuItem::linkToCrud($this->translator->trans('menu.configuration.reader'), 'fas fa-bezier-curve', Reader::class),
MenuItem::linkToRoute($this->translator->trans('menu.configuration.appointment'), 'fas fa-clock', 'program_appointments'),
MenuItem::linkToCrud($this->translator->trans('menu.configuration.log'), 'fa fa-list', Log::class)->setPermission($this->roleSuperAdmin),
MenuItem::linkToRoute($this->translator->trans('menu.configuration.help-editor'), 'fas fa-question-circle', 'help_page')->setPermission($this->roleSuperAdmin),
]),
MenuItem::linkToRoute($this->translator->trans('menu.help'), 'fas fa-question-circle', 'help_page_index'),
];
}
public function configureUserMenu(UserInterface $user): UserMenu
{
$profileUrl = $this->adminUrlGenerator
->unsetAll()
->setController(UserCrudController::class)
->setAction(Action::EDIT)
->setEntityId($user->getId())
->generateUrl();
return parent::configureUserMenu($user)
->setName($user->getUsername())
->displayUserAvatar(false)
->addMenuItems([
MenuItem::linkToUrl($this->translator->trans('user_menu.profile'), 'fa fa-id-card', $profileUrl),
]);
}
public function index(): Response
{
$centers = $this->centerService->getAllCentersByUser($this->getUser());
$warehouses = $this->warehouseService->getAllWarehousesByUser($this->getUser());
$articles = $this->articleService->getAllArticlesByUser($this->getUser());
$services = $this->serviceService->getAllServicesByUser($this->getUser());
$showGraph = !in_array($this->roleService, $this->getUser()->getRoles());
return $this->render('admin/dashboard/welcome.html.twig', ['centers' => $centers, 'articles' => $articles, 'warehouses' => $warehouses, 'services' => $services, 'showGraph' => $showGraph]);
}
protected function getUrlNewOrdersWarehouse(string $state)
{
return $this->adminUrlGenerator
->unsetAll()
->setController(OrderCrudController::class)
->setAction(Action::NEW)
->setAll([
'state' => $state,
'menuIndex' => '1',
'submenuIndex' => '0',
])
->generateUrl();
}
protected function getUrlOrdersWarehouseByState(string $state)
{
return $this->adminUrlGenerator
->unsetAll()
->setController(OrderCrudController::class)
->setAction(Action::INDEX)
->setAll([
'state' => $state,
'menuIndex' => '1',
'submenuIndex' => $this->getPositionSubmenu($state),
])
->generateUrl();
}
protected function getPositionSubmenu(string $state): ?int
{
switch ($state) {
case $this->pendingStatus:
return 1;
case $this->validatedStatus:
return 2;
case $this->issuedStatus:
return 3;
case $this->processedStatus:
return 4;
case $this->canceledStatus:
return 5;
}
return null;
}
}