You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
8.0KB

  1. <?php
  2. namespace Lc\PietroBundle\Controller\IndividualData;
  3. use App\Entity\Configuration;
  4. use App\Entity\IndividualData;
  5. use Lc\PietroBundle\Container\IndividualData\IndividualDataContainer;
  6. use Lc\PietroBundle\Form\Dream\DreamType;
  7. use Lc\PietroBundle\Form\ProjectBoost\ProjectBoostType;
  8. use Lc\PietroBundle\Form\ProjectInspiring\ProjectInspiringType;
  9. use Lc\PietroBundle\Form\Revolt\RevoltType;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Doctrine\ORM\QueryBuilder;
  12. use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
  13. use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
  14. use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
  15. use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
  16. use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
  17. use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
  18. use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
  19. use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
  20. use EasyCorp\Bundle\EasyAdminBundle\Field\HiddenField;
  21. use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
  22. use Lc\PietroBundle\Repository\Dream\DreamStore;
  23. use Lc\PietroBundle\Repository\ProjectBoost\ProjectBoostStore;
  24. use Lc\PietroBundle\Repository\ProjectInspiring\ProjectInspiringStore;
  25. use Lc\PietroBundle\Repository\Revolt\RevoltStore;
  26. use Symfony\Component\HttpFoundation\Request;
  27. use Lc\SovBundle\Controller\AbstractAdminController;
  28. use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField;
  29. use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
  30. use Lc\SovBundle\Field\CollectionField;
  31. use Lc\SovBundle\Field\StatusField;
  32. use Lc\SovBundle\Generator\CsvGenerator;
  33. abstract class IndividualDataAdminController extends AbstractAdminController
  34. {
  35. protected DreamStore $dreamStore;
  36. protected RevoltStore $revoltStore;
  37. protected ProjectBoostStore $projectBoostStore;
  38. protected ProjectInspiringStore $projectInspiringStore;
  39. public function __construct(
  40. DreamStore $dreamStore,
  41. RevoltStore $revoltStore,
  42. ProjectBoostStore $projectBoostStore,
  43. ProjectInspiringStore $projectInspiringStore
  44. ) {
  45. $this->dreamStore = $dreamStore;
  46. $this->revoltStore = $revoltStore;
  47. $this->projectBoostStore = $projectBoostStore;
  48. $this->projectInspiringStore = $projectInspiringStore;
  49. }
  50. public function createEntity(string $entityFqcn)
  51. {
  52. return $this->get(IndividualDataContainer::class)
  53. ->getFactory()
  54. ->create();
  55. }
  56. public static function getEntityFqcn(): string
  57. {
  58. return IndividualData::class;
  59. }
  60. public function configureFields(string $pageName): iterable
  61. {
  62. // TextField::new('firstname'),
  63. // TextField::new('lastname'),
  64. // EmailField::new('email'),
  65. // TextField::new('introAnswer'),
  66. $fields = array();
  67. $fields[] = AssociationField::new('territory')
  68. ->setTemplatePath('crud/field/association.html.twig');
  69. $fields[] = TextField::new('nbDream')
  70. ->onlyOnIndex();
  71. $fields[] = TextField::new('nbRevolt')
  72. ->onlyOnIndex();
  73. $fields[] = TextField::new('nbProjectBoost')
  74. ->onlyOnIndex();
  75. $fields[] = TextField::new('nbProjectInspiring')
  76. ->onlyOnIndex();
  77. $fields[] = CollectionField::new('revolt')
  78. ->setFormTypeOption('entry_type', RevoltType::class)
  79. ->setFormTypeOption('by_reference', false)
  80. ->setRequired(false)
  81. ->hideOnIndex();
  82. $fields[] = CollectionField::new('dream')
  83. ->setFormTypeOption('entry_type', DreamType::class)
  84. ->setFormTypeOption('by_reference', false)
  85. ->setRequired(false)
  86. ->hideOnIndex();
  87. $fields[] = CollectionField::new('projectBoost')
  88. ->setFormTypeOption('entry_type', ProjectBoostType::class)
  89. ->setFormTypeOption('by_reference', false)
  90. ->setRequired(false)
  91. ->hideOnIndex();
  92. $fields[] = CollectionField::new('projectinspiring')
  93. ->setFormTypeOption('entry_type', ProjectInspiringType::class)
  94. ->setFormTypeOption('by_reference', false)
  95. ->setRequired(false)
  96. ->hideOnIndex();
  97. $hasAccess = $this->isGranted('ROLE_ADMIN');
  98. if ($hasAccess) {
  99. $fields[] = StatusField::new('status')
  100. ->setFormTypeOption('data', 0)
  101. ->setFormTypeOption('choices', ['Validé' => 1, 'En attente' => 0])
  102. ->setCustomOption('toggle_label', 'Valider')
  103. ->hideOnIndex();
  104. } else {
  105. $fields[] = HiddenField::new('status')
  106. ->setFormTypeOption('data', 0)
  107. ->hideOnIndex();
  108. }
  109. return $fields;
  110. }
  111. // public function persistEntity(EntityManagerInterface $entityManager, $entityInstance): void
  112. // {
  113. // $configurationRepository = $this->getDoctrine()->getRepository(Configuration::class);
  114. //
  115. // $configuration = $configurationRepository->findOneByDevAlias('intro_question');
  116. // $entityInstance->setIntroQuestion($configuration->getValue());
  117. // $entityManager->persist($entityInstance);
  118. // $entityManager->flush();
  119. //
  120. // parent::persistEntity($entityManager, $entityInstance);
  121. // }
  122. public function createIndexQueryBuilder(
  123. SearchDto $searchDto,
  124. EntityDto $entityDto,
  125. FieldCollection $fields,
  126. FilterCollection $filters
  127. ): QueryBuilder {
  128. $queryBuilder = parent::createIndexQueryBuilder(
  129. $searchDto,
  130. $entityDto,
  131. $fields,
  132. $filters
  133. );
  134. $queryBuilder->andWhere('entity.status = ' . $searchDto->getRequest()->get('status'));
  135. return $queryBuilder;
  136. }
  137. public function configureActions(Actions $actions): Actions
  138. {
  139. parent::configureActions($actions);
  140. $export = Action::new('export', 'actions.export')
  141. ->setIcon('fa fa-download')
  142. ->linkToCrudAction('exportCsv')
  143. ->setCssClass('btn btn-primary')
  144. ->createAsGlobalAction();
  145. return $actions->add(Crud::PAGE_INDEX, $export);
  146. }
  147. public function exportCsv(Request $request)
  148. {
  149. $csv = new CsvGenerator();
  150. $csv->enableConvertEncoding('ISO-8859-1');
  151. $csv->setTitle('Export_Liste', true);
  152. $columns = [
  153. 'category' => 'Catégorie',
  154. 'thematic' => 'Thématique',
  155. 'subthematic' => 'Contribution',
  156. 'territory' => 'Lieu',
  157. 'description' => 'Description'
  158. ];
  159. $csv->setColumns($columns);
  160. $resultArray = $this->generateAllResultArray();
  161. $csv = $this->generateCsvData($csv, $resultArray);
  162. return $csv->getReponse();
  163. }
  164. private function generateAllResultArray(): array
  165. {
  166. $dreamArray = $this->dreamStore->get();
  167. $revoltArray = $this->revoltStore->get();
  168. $projectBoostArray = $this->projectBoostStore->get();
  169. $projectInspiringArray = $this->projectInspiringStore->get();
  170. return array_merge($dreamArray, $revoltArray, $projectBoostArray, $projectInspiringArray);
  171. }
  172. private function generateCsvData($csv, $resultArray)
  173. {
  174. foreach ($resultArray as $result) {
  175. $territory = $subthematic = $thematic = "";
  176. if ($result->getIndividualData()) {
  177. $territory = $result->getIndividualData()->getTerritory()->getName();
  178. if ($result->getSubthematic()) {
  179. $subthematic = $result->getSubthematic()->getName();
  180. }
  181. if ($result->getThematic()) {
  182. $thematic = $result->getThematic()->getName();
  183. }
  184. $data = [
  185. 'category' => $result->__toString(),
  186. 'thematic' => $thematic,
  187. 'subthematic' => $subthematic,
  188. 'territory' => $territory,
  189. 'description' => $result->getDescription()
  190. ];
  191. $csv->row($data);
  192. }
  193. }
  194. return $csv;
  195. }
  196. }