<?php
namespace App\Controller\Admin;
use App\Entity\ContactConfig;
use App\Entity\Contributor;
use App\Entity\ContributorConfig;
use App\Entity\MentionLegal;
use App\Entity\PageNotFound;
use App\Entity\Preference;
use App\Repository\BlogPostRepository;
use App\Repository\ContactConfigRepository;
use App\Repository\ContactRepository;
use App\Repository\MaintenanceRepository;
use App\Entity\BlogPost;
use App\Entity\BlogPostCategory;
use App\Entity\Contact;
use App\Entity\CookiesPolicy;
use App\Entity\Criteria1;
use App\Entity\Criteria2;
use App\Entity\Criteria3;
use App\Entity\FreePage;
use App\Entity\Media;
use App\Entity\Newsletter;
use App\Entity\Policy;
use App\Entity\Radio;
use App\Entity\Roles;
use App\Entity\Room;
use App\Entity\SiteConfig;
use App\Entity\SiteCustomization;
use App\Entity\SocialNetwork;
use App\Entity\TermsOfUse;
use App\Entity\User;
use App\Entity\Maintenance;
use App\Repository\CookiesPolicyRepository;
use App\Repository\Criteria1Repository;
use App\Repository\Criteria2Repository;
use App\Repository\Criteria3Repository;
use App\Repository\MentionLegalRepository;
use App\Repository\PageNotFoundRepository;
use App\Repository\PolicyRepository;
use App\Repository\RolesRepository;
use App\Repository\TermsOfUseRepository;
use App\Repository\UserRepository;
use App\Service\SiteConfig as ServiceSiteConfig;
use App\Service\SiteCustomization as SiteCustomizationService;
use App\Service\SocialNetwork as SocialNetworkService;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Assets;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class DashboardController extends AbstractDashboardController
{
public function __construct(
private ServiceSiteConfig $config,
private PolicyRepository $policyRepository,
private CookiesPolicyRepository $cookiesPolicyRepository,
private TermsOfUseRepository $termsOfUseRepository,
private MentionLegalRepository $mentionLegalRepository,
private SocialNetworkService $socialNetwork,
private SiteCustomizationService $siteCustomization,
private MaintenanceRepository $maintenanceRepository,
private PageNotFoundRepository $pageNotFoundRepository,
private BlogPostRepository $blogPostRepo,
private UserRepository $userRepo,
private ContactRepository $contactRepo,
private RolesRepository $rolesRepo,
private ContactConfigRepository $contactConfigRepo,
private Criteria1Repository $criteria1Repository,
private Criteria2Repository $criteria2Repository,
private Criteria3Repository $criteria3Repository,
) {}
/**
* @Route("/admin", name="admin")
*/
public function index(): Response
{
$request = $this->get('request_stack')->getMainRequest();
$response = new Response();
$cookies = $request->cookies;
if ($cookies->has('bienvenue')) {
} else {
$this->addFlash('success', 'Bonjour, bienvenue');
$value = 'ok';
$cookie = new Cookie('bienvenue', $value, (time() + 3600 * 24 * 7), '/');
$response = new Response();
$response->headers->setCookie($cookie);
$response->send();
}
$contactDay = $this->contactRepo->getTotalContactsByDay();
$contactWeek = $this->contactRepo->getTotalContactsByWeek();
$contactMonth = $this->contactRepo->getTotalContactsByMonth();
$userTotal = $this->userRepo->getTotalUsers();
$userDay = $this->userRepo->getTotalUsersByDay();
$userWeek = $this->userRepo->getTotalUsersByWeek();
$userMonth = $this->userRepo->getTotalUsersByMonth();
$blogPostTotal = $this->blogPostRepo->getTotalBlogPost();
$roleTotal = $this->rolesRepo->getTotalRoles();
return $this->render('admin/dashboard.html.twig', [
'userTotal' => $userTotal,
'userDay' => $userDay,
'userWeek' => $userWeek,
'userMonth' => $userMonth,
'contactDay' => $contactDay,
'contactWeek' => $contactWeek,
'contactMonth' => $contactMonth,
'blogPostTotal' => $blogPostTotal,
'roleTotal' => $roleTotal,
]);
}
/**
* @return Assets
*/
public function configureAssets(): Assets
{
return Assets::new()
->addCssFile('assets/admin/js/vanilla-icon-picker/themes/default.min.css')
->addCssFile('assets/admin/css/app.css')
->addCssFile('assets/admin/css/stateDashboard.css')
->addJsFile('assets/admin/tinymce/js/tinymce/tinymce.min.js')
->addJsFile('https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js')
->addJsFile('assets/admin/js/vanilla-icon-picker/icon-picker.min.js')
->addJsFile('assets/admin/js/app.js')
->addJsFile('assets/admin/js/stateDashboard.js')
->addJsFile('assets/admin/js/rubrique-link.js');
}
/**
* @return Actions
*/
public function configureActions(): Actions
{
return parent::configureActions()
->add(Crud::PAGE_INDEX, Action::DETAIL);
}
/**
* @return Crud
*/
public function configureCrud(): Crud
{
return Crud::new()
->setDefaultSort(['id' => 'DESC'])
->overrideTemplates([
'crud/index' => 'admin/crud/index.html.twig',
'crud/edit' => 'admin/crud/edit.html.twig',
]);
}
/**
* @return Dashboard
*/
public function configureDashboard(): Dashboard
{
return Dashboard::new()
->setTitle(sprintf('<img class="logo" src="%s" alt="Logo">', $this->config->getLogoUrl() ?? '/assets/images/logo.svg'))
->setFaviconPath($this->config->getFaviconUrl() ?? '/favicon.ico')
->generateRelativeUrls();
}
/**
* @return iterable
*/
public function configureMenuItems(): iterable
{
// List of menu items to be shown on the top menu
yield MenuItem::section('bo.menu.main')
->setCssClass('sidebar-menu-item d-list-item d-md-none');
if (
in_array(User::ROLE_ADMIN, $this->getUser()->getRoles()) ||
in_array(User::ROLE_DIRECTEUR, $this->getUser()->getRoles()) ||
in_array(User::ROLE_CHEF_REDACTEUR, $this->getUser()->getRoles()) ||
in_array(User::ROLE_ADJOINT_REDACTEUR, $this->getUser()->getRoles())
) {
yield MenuItem::linkToDashboard('bo.dashboard.title', 'fa fa-tachometer');
yield MenuItem::linkToCrud('bo.pages.title-plural', 'fas fa-copy', FreePage::class);
yield MenuItem::linkToCrud('bo.blog-post-category.title-plural', 'fas fa-list-alt', BlogPostCategory::class);
yield MenuItem::linkToCrud('bo.preference.title-plural', 'fas fa-cogs', Preference::class);
yield MenuItem::linkToCrud('bo.blog-post.tab-title', 'fas fa-newspaper', BlogPost::class);
yield MenuItem::linkToCrud('Contributions', 'fas fa-newspaper', Contributor::class);
yield MenuItem::linkToCrud('bo.medias.tab-title', 'fas fa-images', Media::class);
yield MenuItem::linkToCrud('bo.radio.title-plural', 'fas fa-stop-circle', Radio::class);
yield MenuItem::linkToCrud('Audience', 'fas fa-newspaper', Room::class)
->setController(AudienceTestCrudController::class);
yield MenuItem::linkToCrud('bo.users.title-plural', 'fa fa-users', User::class);
yield MenuItem::linkToCrud('bo.contact.title-plural', 'fas fa-envelope', Contact::class);
} else if (in_array('ROLE_CHEF_RUBRIQUE', $this->getUser()->getRoles())) {
yield MenuItem::linkToCrud('bo.blog-post-category.title-plural', 'fas fa-list-alt', BlogPostCategory::class);
yield MenuItem::linkToCrud('bo.blog-post.tab-title', 'fas fa-newspaper', BlogPost::class);
yield MenuItem::linkToCrud('bo.medias.tab-title', 'fas fa-images', Media::class);
} else if (in_array('ROLE_REDACTEUR', $this->getUser()->getRoles())) {
yield MenuItem::linkToCrud('bo.blog-post.tab-title', 'fas fa-newspaper', BlogPost::class);
}
// List of menu items to be shown on the sidebar menu
// Add 'sidebar-menu-item' class to the menu item to show it only on the sidebar
if (in_array('ROLE_ADMIN', $this->getUser()->getRoles())) {
yield MenuItem::section()
->setCssClass('sidebar-menu-item d-list-item d-md-none');
yield MenuItem::linkToCrud('Newsletter', 'fas fa-newspaper', Newsletter::class)
->setCssClass('sidebar-menu-item');
yield MenuItem::linkToCrud('Réseaux sociaux', 'fa fa-network-wired', SocialNetwork::class)
->setAction(Action::EDIT)
->setEntityId($this->socialNetwork->getEntityId())
->setCssClass('sidebar-menu-item');
yield MenuItem::linkToCrud('Rôles', 'fa fa-users', Roles::class)
->setCssClass('sidebar-menu-item');
$criteriaMenu = MenuItem::subMenu('Critères', 'fas fa-paint-brush');
$criteriaSubMenus[] = MenuItem::linkToCrud('Critère n°1', 'fas fa-cogs', Criteria1::class)
->setAction(Action::EDIT)
->setEntityId($this->criteria1Repository->findOneBy([])?->getId())
->setCssClass('sidebar-menu-item');
$criteriaSubMenus[] = MenuItem::linkToCrud('Critère n°2', 'fas fa-cogs', Criteria2::class)
->setAction(Action::EDIT)
->setEntityId($this->criteria2Repository->findOneBy([])?->getId())
->setCssClass('sidebar-menu-item');
$criteriaSubMenus[] = MenuItem::linkToCrud('Critère n°3', 'fas fa-cogs', Criteria3::class)
->setAction(Action::EDIT)
->setEntityId($this->criteria3Repository->findOneBy([])?->getId())
->setCssClass('sidebar-menu-item');
yield $criteriaMenu->setSubItems($criteriaSubMenus)
->setCssClass('sidebar-menu-item');
yield MenuItem::linkToCrud('Formulaire contribution', 'fas fa-cogs', ContributorConfig::class)
->setAction(Action::EDIT)
->setEntityId($this->config->getContributorConfigEntityId())
->setCssClass('sidebar-menu-item');
yield MenuItem::section()
->setCssClass('sidebar-menu-item');
yield MenuItem::linkToCrud('Accès', 'fas fa-cogs', Maintenance::class)
->setCssClass('sidebar-menu-item')
->setAction(Action::EDIT)
->setEntityId($this->maintenanceRepository->findOneBy([])?->getId());
yield MenuItem::linkToCrud('bo.siteconfig.title', 'fas fa-cogs', SiteConfig::class)
->setAction(Action::EDIT)
->setEntityId($this->config->getEntityId())
->setCssClass('sidebar-menu-item');
// Juridique
$legalMenu = MenuItem::subMenu('Juridique', 'fas fa-paint-brush');
$legalMenuSubs[] = MenuItem::linkToCrud('bo.policy.title', 'fa fa-file-alt', Policy::class)
->setAction(Action::EDIT)
->setEntityId($this->policyRepository->findOneBy([])?->getId())
->setCssClass('sidebar-menu-item');
$legalMenuSubs[] = MenuItem::linkToCrud('bo.cookies-policy.title', 'fa fa-file-alt', CookiesPolicy::class)
->setAction(Action::EDIT)
->setEntityId($this->cookiesPolicyRepository->findOneBy([])?->getId())
->setCssClass('sidebar-menu-item');
$legalMenuSubs[] = MenuItem::linkToCrud('bo.terms-of-use.title', 'fa fa-file-alt', TermsOfUse::class)
->setAction(Action::EDIT)
->setEntityId($this->termsOfUseRepository->findOneBy([])?->getId())
->setCssClass('sidebar-menu-item');
$legalMenuSubs[] = MenuItem::linkToCrud('Mention legal', 'fa fa-file-alt', MentionLegal::class)
->setAction(Action::EDIT)
->setEntityId($this->mentionLegalRepository->findOneBy([])?->getId())
->setCssClass('sidebar-menu-item');
yield $legalMenu->setSubItems($legalMenuSubs)
->setCssClass('sidebar-menu-item');
yield MenuItem::linkToCrud('Message contact', 'fas fa-cogs', ContactConfig::class)
->setAction(Action::EDIT)
->setEntityId($this->contactConfigRepo->findOneBy([])?->getId())
->setCssClass('sidebar-menu-item');
$customizationMenu = MenuItem::subMenu('bo.site-customization.title', 'fas fa-paint-brush');
$customizationSubs[] = MenuItem::linkToCrud('Page 404', 'fas fa-cogs', PageNotFound::class)
->setAction(Action::EDIT)
->setEntityId($this->pageNotFoundRepository->findOneBy([])?->getId())
->setCssClass('sidebar-menu-item');
$customizationSubs[] = MenuItem::linkToCrud('bo.site-customization.general-color', 'fas fa-paint-brush', SiteCustomization::class)
->setAction(Action::EDIT)
->setEntityId($this->siteCustomization->getEntityId());
yield $customizationMenu->setSubItems($customizationSubs)
->setCssClass('sidebar-menu-item');
}
}
}