<?php
namespace App\Controller\Admin;
use App\Entity\Article;
use App\Entity\ArticleCategorie;
use App\Entity\ArticleCritere;
use App\Entity\ArticleCritereValeur;
use App\Entity\ArticleType;
use App\Entity\Formulaire;
use App\Entity\FormulaireChamp;
use App\Entity\FormulaireInput;
use App\Entity\FormulaireRecap;
use App\Entity\Page;
use App\Entity\Projet;
use App\Entity\User;
use App\Entity\Combi;
use App\Entity\UserRole;
use App\Entity\Groupe;
use App\Entity\Objet;
use App\Entity\Section;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
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 EasyCorp\Bundle\EasyAdminBundle\Provider\AdminContextProvider;
use Flasher\SweetAlert\Prime\SweetAlertFactory;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
class DashboardController extends AbstractDashboardController
{
private ManagerRegistry $manager;
private $adminContextProvider;
private SweetAlertFactory $flasher;
private EntityManagerInterface $entityManager;
public function __construct(
ManagerRegistry $manager,
AdminContextProvider $adminContextProvider,
SweetAlertFactory $flasher,
EntityManagerInterface $entityManager
) {
$this->manager = $manager;
$this->adminContextProvider = $adminContextProvider;
$this->flasher = $flasher;
$this->entityManager = $entityManager;
}
/**
* @Security("is_granted('ROLE_SUPER_ADMIN') or is_granted('ROLE_UTILISATEUR') ")
* @Route("/admin", name="admin")
*/
public function index(): Response
{
$projects = $this->manager->getRepository(Projet::class)->findAll();
if ($this->isGranted('ROLE_SUPER_ADMIN')) {
$projectSelected = true;
} else {
$projectSelected = false;
$userRoles = $this->getUser()->getUserRoles();
foreach ($userRoles as $useRole) {
if ($useRole->getProjet() == $this->getUser()->getProjet()) {
$projectSelected = true;
}
}
}
if (!$projectSelected) {
return $this->render('admin/index.html.twig', ['projects' => $projects, 'projet' => null]);
} else {
$projet = $this->getUser()->getProjet();
$dataObjetscharts = [];
$dataPagecharts = [];
$mainPages = $this->entityManager->getRepository(Page::class)->createQueryBuilder('p')
->where('p.parent is null and p.projet = :projet')
->setParameter('projet', $projet)
->getQuery()
->getResult();
$objetAll = $this->entityManager->getRepository(Objet::class)->createQueryBuilder('o')
->where('o.visibility LIKE :visibilty and o.projet = :projet')
->setParameter('visibilty', '%"visible_all"%')
->setParameter('projet', $projet)
->getQuery()
->getResult();
$objetByAccueil = $this->entityManager->getRepository(Objet::class)->createQueryBuilder('o')
->where('o.visibility LIKE :visibilty and o.projet = :projet')
->setParameter('visibilty', '%"visible_accueil"%')
->setParameter('projet', $projet)
->getQuery()
->getResult();
$objetByPage = $this->entityManager->getRepository(Objet::class)->createQueryBuilder('o')
->where('o.visibility LIKE :visibilty and o.projet = :projet')
->setParameter('visibilty', '%"visible_page"%')
->setParameter('projet', $projet)
->getQuery()
->getResult();
$objetByArticle = $this->entityManager->getRepository(Objet::class)->createQueryBuilder('o')
->where('o.visibility LIKE :visibilty and o.projet = :projet')
->setParameter('visibilty', '%"visible_article"%')
->setParameter('projet', $projet)
->getQuery()
->getResult();
$dataObjetscharts = [
["label" => "Dans tout", "y" => count($objetAll), "color" => "#352828"],
["label" => "Accueil", "y" => count($objetByAccueil), "color" => "#46aa82"],
["label" => "Page", "y" => count($objetByPage), "color" => "#818dd1"],
["label" => "Article", "y" => count($objetByArticle), "color" => "#c44536"],
];
foreach ($mainPages as $key => $mainPage) {
$pageByParent = $this->manager->getRepository(Page::class)->findBy(['parent' => $mainPage]);
array_push($dataPagecharts, ["label" => $mainPage->getTitre(), "y" => count($pageByParent)]);
}
$dataObjetscharts = json_encode($dataObjetscharts, JSON_NUMERIC_CHECK);
$dataPagecharts = json_encode($dataPagecharts, JSON_NUMERIC_CHECK);
return $this->render('admin/index.html.twig', ['projects' => $projects, 'projet' => $projet, 'dataObjetscharts' => $dataObjetscharts, 'dataPagecharts' => $dataPagecharts]);
}
}
public function configureDashboard(): Dashboard
{
return Dashboard::new()
->setTitle('Devil It Applications CMS');
}
public function configureMenuItems(): iterable
{
$import_export = false;
$projet = false;
$manageUsers = false;
$page = false;
$article = false;
$param_article = false;
$formulaire = false;
$combi = false;
$objet = false;
$section = false;
if ($this->isGranted('ROLE_SUPER_ADMIN')) {
yield MenuItem::linkToRoute(strtoupper($this->getUser()->getProjet()), 'fa fa-check', 'app_admin_change_project')->setCssClass('menu-header mb-3');
} else {
$projectSelected = false;
$userRoles = $this->getUser()->getUserRoles();
foreach ($userRoles as $useRole) {
if ($useRole->getProjet() == $this->getUser()->getProjet()) {
$projectSelected = true;
}
}
if (!$projectSelected) {
yield MenuItem::linkToRoute('', 'fa fa-check', 'app_admin_change_project')->setCssClass('menu-header mb-3');
} else {
yield MenuItem::linkToRoute(strtoupper($this->getUser()->getProjet()), 'fa fa-check', 'app_admin_change_project')->setCssClass('menu-header mb-3');
}
}
yield MenuItem::linkToDashboard('Tableau de bord', 'fa fa-dashboard');
if ($this->getUser()->getProjet() != null) {
if ($this->isGranted('ROLE_SUPER_ADMIN')) {
$import_export = true;
$projet = true;
$manageUsers = true;
$page = true;
$article = true;
$param_article = true;
$formulaire = true;
$combi = true;
$objet = true;
$section = true;
} else {
$user = $this->getUser();
$project = $user->getProjet();
$roles = $this->manager->getRepository(UserRole::class)->findBy(['user' => $user, 'projet' => $project]);
foreach ($roles as $role) {
$groupe = $role->getGroupe();
$label = $groupe->getLabel();
if ($label == 'ROLE_ADMIN') {
$import_export = true;
$projet = true;
$page = true;
$article = true;
$param_article = true;
$formulaire = true;
$combi = true;
$objet = true;
$section = true;
} else {
if ($groupe->getProjet()) {
$projet = true;
}
if ($groupe->getImportExport()) {
$import_export = true;
}
if ($groupe->getPage()) {
$page = true;
}
if ($groupe->getArticle()) {
$article = true;
}
if ($groupe->getParamArticle()) {
$param_article = true;
}
if ($groupe->getFormulaire()) {
$formulaire = true;
}
if ($groupe->getCombi()) {
$combi = true;
}
if ($groupe->getObjet()) {
$objet = true;
}
if ($groupe->getSection()) {
$section = true;
}
}
}
}
/*******************************************/
if ($projet || $import_export || $manageUsers) {
yield MenuItem::section('Paramétrage', '');
}
/**************** Import--Export ************************************************/
if ($import_export) {
yield MenuItem::linkToRoute('Import / Export', 'fa fa-file-csv', 'app_import_export');
}
/**************** Projet************************************************/
if ($projet) {
yield MenuItem::linkToCrud('Projets', 'fa fa-lightbulb', Projet::class);
}
if ($manageUsers) {
yield MenuItem::linkToCrud('Utilisateurs', 'fas fa-users', User::class);
yield MenuItem::linkToCrud('Groupe', 'fa fa-user-lock', Groupe::class);
}
/*******************************************/
if ($page || $article) {
yield MenuItem::section('Redaction', 'fa fa-keyboard');
}
/**************** Page************************************************/
if ($page) {
yield MenuItem::linkToCrud('Page', 'fa fa-map', Page::class);
}
/**************** Article************************************************/
$types = $this->manager->getRepository(ArticleType::class)->findBy(['projet' => $this->getUser()->getProjet()->getId()]);
if ($article) {
if (count($types) > 0) {
foreach ($types as $type) {
if ($type->getIcon() != null && $type->getIcon() != '') {
yield MenuItem::linkToCrud($type->getType(), $type->getIcon(), Article::class)->setQueryParameter('typeid', $type->getId());
} else {
yield MenuItem::linkToCrud($type->getType(), 'fa fa-newspaper', Article::class)->setQueryParameter('typeid', $type->getId());
}
}
}
}
/*******************************************/
if ($objet || $combi) {
yield MenuItem::section('Contenu', '');
}
/**************** Combi ************************************************/
if ($combi) {
yield MenuItem::linkToCrud('Combi', 'fa fa-sitemap', Combi::class);
}
/**************** Objet ************************************************/
if ($objet) {
yield MenuItem::linkToCrud('Objet', 'fa fa-object-group', Objet::class);
}
/**************** Section ************************************************/
if ($section) {
yield MenuItem::linkToCrud('Code Section', 'fa fa-vector-square', Section::class);
}
/**************** Paramètrage Article************************************************/
if ($param_article) {
yield MenuItem::section('Paramétrage Article', '');
yield MenuItem::linkToCrud('Type', 'fa fa-columns', ArticleType::class);
if (count($types) > 0) {
foreach ($types as $type) {
if ($type->getIcon() != null && $type->getIcon() != '') {
yield MenuItem::subMenu($type->getType(), $type->getIcon())->setSubItems([
MenuItem::linkToCrud('Categorie', 'fa fa-layer-group', ArticleCategorie::class)->setQueryParameter('typeid', $type->getId()),
MenuItem::linkToCrud('Critère', 'fa fa-paperclip', ArticleCritere::class)->setQueryParameter('typeid', $type->getId()),
MenuItem::linkToCrud('Valeur Critère', 'fa fa-hashtag', ArticleCritereValeur::class)->setQueryParameter('typeid', $type->getId()),
]);
} else {
yield MenuItem::subMenu($type->getType(), 'fa fa-pager')->setSubItems([
MenuItem::linkToCrud('Categorie', 'fa fa-layer-group', ArticleCategorie::class)->setQueryParameter('typeid', $type->getId()),
MenuItem::linkToCrud('Critère', 'fa fa-paperclip', ArticleCritere::class)->setQueryParameter('typeid', $type->getId()),
MenuItem::linkToCrud('Valeur Critère', 'fa fa-hashtag', ArticleCritereValeur::class)->setQueryParameter('typeid', $type->getId()),
]);
}
}
}
}
/**************** Formulaire************************************************/
if ($formulaire) {
yield MenuItem::section('Formulaire', '');
yield MenuItem::linkToCrud('Formulaire', 'fa fa-file-contract', Formulaire::class);
yield MenuItem::linkToCrud('Input', 'fa fa-bars', FormulaireInput::class);
yield MenuItem::linkToCrud('Recap', 'fa fa-id-card', FormulaireRecap::class);
yield MenuItem::linkToCrud('Champs', 'fa fa-clipboard-list', FormulaireChamp::class);
}
// /*******************************************/
// if ($objet || $combi) {
// yield MenuItem::section('Contenu', '');
// }
// /**************** Combi ************************************************/
// if ($combi) {
// yield MenuItem::linkToCrud('Combi', 'fa fa-sitemap', Combi::class);
// }
// /**************** Objet ************************************************/
// if ($objet) {
// yield MenuItem::linkToCrud('Objet', 'fa fa-object-group', Objet::class);
// }
// /**************** Section ************************************************/
// if ($section) {
// yield MenuItem::linkToCrud('Code Section', 'fa fa-vector-square', Section::class);
// }
}
yield MenuItem::section('Personnel', '');
// yield MenuItem::linkToDashboard('Changer mot de passe', 'fa fa-key');
yield MenuItem::linkToRoute('Changer mot de passe', 'fa fa-key', 'app_change_password');
yield MenuItem::linkToLogout('Déconnecter', 'fa fa-fw fa-sign-out');
}
public function configureAssets(): Assets
{
return parent::configureAssets()
->addCssFile('node_modules/bootstrap-icons/font/bootstrap-icons.css')
->addCssFile('node_modules/datatables.net-dt/css/jquery.dataTables.min.css')
->addCssFile('css/trixcss.css')
->addJsFile('node_modules/jquery/dist/jquery.js')
->addJsFile('node_modules/datatables.net/js/jquery.dataTables.min.js')
->addJsFile('js/trixjs.js')
->addJsFile('canvasjs/canvasjs.min.js')
->addCssFile('css/admin-dashboard.css');
}
public function configureActions(): Actions
{
return parent::configureActions()
->update(Crud::PAGE_NEW, Action::SAVE_AND_ADD_ANOTHER, function (Action $action) {
return $action->addCssClass('btn-secondary');
})
->update(Crud::PAGE_EDIT, Action::SAVE_AND_CONTINUE, function (Action $action) {
return $action->addCssClass('btn-secondary');
})
->update(Crud::PAGE_INDEX, Action::EDIT, function (Action $action) {
return $action->setLabel('Modifier');
})
->remove(Crud::PAGE_DETAIL, Action::DELETE)
->remove(Crud::PAGE_DETAIL, Action::INDEX)
->remove(Crud::PAGE_DETAIL, Action::EDIT);
}
}