<?php
namespace App\Controller\Admin;
use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use App\Entity\Cars;
use App\Entity\CarOwner;
use App\Entity\Repairs;
use App\Entity\Quotes;
use App\Entity\Settings;
use App\Entity\User;
use App\Entity\Events;
use App\Entity\AttachmentTags;
use App\Entity\Group;
use App\Entity\InventoryProduct;
use EasyCorp\Bundle\EasyAdminBundle\Config\UserMenu;
use Symfony\Component\Security\Core\User\UserInterface;
use App\Controller\Admin\UserCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use App\Service\Settings as SettingsService;
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
use EasyCorp\Bundle\EasyAdminBundle\Attribute\AdminDashboard;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Translation\TranslatableMessage;
#[AdminDashboard(routePath: '/admin/{_locale}', routeName: 'admin')]
class DashboardController extends AbstractDashboardController
{
private $settings;
private $params;
private $translator;
public function __construct(ContainerBagInterface $params, SettingsService $settings, TranslatorInterface $translator)
{
$this->settings = $settings;
$this->params = $params;
$this->translator = $translator;
}
public function index(): Response
{
if ($this->getUser() == null) {
return $this->redirect('login');
}
return $this->render('page/dashboard.html.twig');
}
/**
* @Route("/{_locale}/show-events", name="show-events")
*/
public function showEvents(): Response
{
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$events = $qb->select("DATE_FORMAT(e.due, '%Y-%m-%d') as start, CONCAT_WS(' ', c.plateNumber, e.title) as title, e.id, 'event' as type")
->from(Events::class, 'e')
->leftJoin(Cars::class, 'c', 'WITH', 'c.id = e.car')
// ->where('p.id= :id')
// ->setParameter('id', 2)
->getQuery()
->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
$content = json_encode($events);
$response = new Response();
$response->headers->set('Content-Type', 'application/json');
$response->setContent($content);
$response->setStatusCode(empty($content) ? Response::HTTP_NO_CONTENT : Response::HTTP_OK);
//return parent::index();
return $response;
}
/**
* @Route("/{_locale}/show-technical-dates", name="show-technical-dates")
*/
public function showTechnicalDates(): Response
{
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$events = $qb->select("DATE_FORMAT(c.technicalDate, '%Y-%m-%d') as start, CONCAT_WS(' ', c.plateNumber, '".$this->translator->trans('Vehicle inspection expiration')."') as title, c.id, 'car' as type")
->from(Cars::class, 'c')
->getQuery()
->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
$content = json_encode($events);
$response = new Response();
$response->headers->set('Content-Type', 'application/json');
$response->setContent($content);
$response->setStatusCode(empty($content) ? Response::HTTP_NO_CONTENT : Response::HTTP_OK);
// return parent::index();
return $response;
}
/**
* @Route("/{_locale}/show-insurance-dates", name="show-insurance-dates")
*/
public function showInsuranceDates(): Response
{
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$events = $qb->select("DATE_FORMAT(c.insurance_duedate, '%Y-%m-%d') as start, CONCAT_WS(' ', c.plateNumber, '".$this->translator->trans('Vehicle insurance expiration')."') as title, c.id, 'car' as type")
->from(Cars::class, 'c')
->getQuery()
->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
$content = json_encode($events);
$response = new Response();
$response->headers->set('Content-Type', 'application/json');
$response->setContent($content);
$response->setStatusCode(empty($content) ? Response::HTTP_NO_CONTENT : Response::HTTP_OK);
// return parent::index();
return $response;
}
public function configureDashboard(): Dashboard
{
return Dashboard::new()
->setTitle($this->settings->get('siteTitle'))
->setFaviconPath('favicon.png')
->renderContentMaximized()
->setTranslationDomain('admin')
->setLocales([
'en' => 'English',
'hu' => 'Magyar',
])
// ->renderSidebarMinimized()
;
}
public function configureMenuItems(): iterable
{
if ($this->getUser() == null) {
return $this->redirect('login');
}
yield MenuItem::linkToDashboard(new TranslatableMessage('Dashboard'), 'fa fa-home');
yield MenuItem::section(new TranslatableMessage('Data'));
yield MenuItem::linkToCrud(new TranslatableMessage('Cars'), 'fas fa-car', Cars::class);
yield MenuItem::linkToCrud(new TranslatableMessage('Customers'), 'fas fa-users', CarOwner::class);
yield MenuItem::section(new TranslatableMessage('Events'));
yield MenuItem::linkToCrud(new TranslatableMessage('Repairs'), 'fas fa-tools', Repairs::class);
yield MenuItem::linkToCrud(new TranslatableMessage('Quotations'), 'fas fa-file-alt', Quotes::class);
yield MenuItem::linkToCrud(new TranslatableMessage('Events'), 'fas fa-clock', Events::class);
yield MenuItem::section(new TranslatableMessage('Inventory'));
yield MenuItem::linkToCrud(new TranslatableMessage('Materials'), 'fas fa-warehouse', InventoryProduct::class);
yield MenuItem::section(new TranslatableMessage('Profile'));
yield MenuItem::linkToCrud(new TranslatableMessage('Profile'), 'fas fa-user', User::class)->setController(UserCrudController::class)->setAction(Action::EDIT)->setEntityId($this->getUser()->getId());
yield MenuItem::section(new TranslatableMessage('System'))->setPermission('ROLE_ADMIN');
yield MenuItem::linkToCrud(new TranslatableMessage('Attachment tags'), 'fas fa-tag', AttachmentTags::class)->setPermission('ROLE_ADMIN');
yield MenuItem::linkToCrud(new TranslatableMessage('Groups'), 'fas fa-layer-group', Group::class)->setQueryParameter('ownerId', $this->getUser()->getId())->setPermission('ROLE_ADMIN');
yield MenuItem::linkToCrud(new TranslatableMessage('Users'), 'fas fa-address-book', User::class)->setPermission(User::ROLE_ADMIN);
if ($this->getUser()->hasRoles(User::ROLE_ADMIN)) {
yield MenuItem::linkToCrud(new TranslatableMessage('Settings'), 'fas fa-cog', Settings::class)->setController(SettingsCrudController::class)->setAction(Action::EDIT)->setEntityId(1);
} else {
yield MenuItem::linkToCrud(new TranslatableMessage('Settings'), 'fas fa-cog', Settings::class)->setController(SettingsCrudController::class)->setAction(Action::EDIT)->setEntityId(1)->setPermission(User::ROLE_SETTINGS);
}
yield MenuItem::section(new TranslatableMessage('Documents'));
if ($this->getUser()->hasRoles(User::ROLE_ADMIN)) {
yield MenuItem::linkToCrud(new TranslatableMessage('GDPR document'), 'fas fa-file-alt', Settings::class)->setController(SettingsCrudController::class)->setAction('printGDPR');
} else {
yield MenuItem::linkToCrud(new TranslatableMessage('GDPR document'), 'fas fa-file-alt', Settings::class)->setController(SettingsCrudController::class)->setAction('printGDPR')->setPermission(User::ROLE_PRINT);
}
yield MenuItem::linkToCrud(new TranslatableMessage('User manual'), 'fas fa-book', Settings::class)->setController(SettingsCrudController::class)->setAction('showUserManual');
}
public function configureUserMenu(UserInterface $user): UserMenu
{
// $adminUrlGenerator = $this->get(AdminUrlGenerator::class);
// $url = $adminUrlGenerator
// ->setController(UserCrudController::class)
// ->setAction(Action::EDIT)
// ->set('entityId', $user->getId())
// ->generateUrl();
return parent::configureUserMenu($user)
->setName($user->getDisplayName() ? $user->getDisplayName() : $user->getUsername())
->displayUserName(true)
->displayUserAvatar(true)
->setMenuItems([
MenuItem::linkToCrud('Profile', 'fas fa-id-card', User::class)->setController(UserCrudController::class)->setAction(Action::EDIT)->setEntityId($this->getUser()->getId()),
MenuItem::linkToLogout('Logout', 'fas fa-sign-out'),
]);
}
public function configureCrud(): Crud
{
return Crud::new()
// the argument must be either one of these strings: 'short', 'medium', 'long', 'full', 'none'
// (the strings are also available as \EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField::FORMAT_* constants)
// or a valid ICU Datetime Pattern (see http://userguide.icu-project.org/formatparse/datetime)
->setDateFormat('Y-MM-dd')
->setTimeFormat('short')
// first argument = datetime pattern or date format; second optional argument = time format
// ->setDateTimeFormat('medium', 'medium')
->setDateTimeFormat('Y-MM-dd H:mm:ss')
->setDateIntervalFormat('%%y év %%m hónap %%d nap')
->setTimezone('Europe/Budapest')
// used to format numbers before rendering them on templates
// ->setNumberFormat('%.3d')
->setPageTitle('detail', '%entity_as_string%')
->showEntityActionsInlined()
->setThousandsSeparator(" ")
;
}
}