Loading module/Oscar/src/Oscar/Entity/ActivityMotCleRepository.php +11 −1 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ class ActivityMotCleRepository extends EntityRepository /** * Retourne tous les mots clés * * @return array * @return ActivityMotCle[] */ public function getAll(){ $query = $this->createQueryBuilder('m') Loading @@ -20,4 +20,14 @@ class ActivityMotCleRepository extends EntityRepository return $query->getQuery()->getResult(); } /** * @return array */ public function getAllArray(){ $out = []; foreach ($this->getAll() as $activityMotCle) { $out[$activityMotCle->getId()] = $activityMotCle->getLabel(); } return $out; } } module/Oscar/src/Oscar/Entity/ActivityRepository.php +11 −0 Original line number Diff line number Diff line Loading @@ -1191,4 +1191,15 @@ class ActivityRepository extends EntityRepository } return array_map('current', $qb->getQuery()->getResult()); } public function getIdsMotclefs(mixed $motclefsIds) { $qb = $this->getEntityManager()->createQueryBuilder() ->select('DISTINCT c.id') ->from(Activity::class, 'c') ->innerJoin('c.motscles', 'm') ->where('m IN (:motcles)') ->setParameter('motcles', $motclefsIds); return array_map('current', $qb->getQuery()->getResult()); } } No newline at end of file module/Oscar/src/Oscar/Service/ProjectGrantSearchService.php +26 −2 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ use Doctrine\ORM\Exception\NotSupported; use Exception; use Laminas\Http\Request; use Oscar\Entity\Activity; use Oscar\Entity\ActivityMotCle; use Oscar\Entity\ActivityMotCleRepository; use Oscar\Entity\DateType; use Oscar\Entity\Person; use Oscar\Entity\Project; Loading Loading @@ -63,6 +65,7 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U const FILTER_ACTIVITY_MILESTONE = 'aj'; const FILTER_ACTIVITY_ACCOUNT = 'cb'; const FILTER_ACTIVITY_NUMBERS = 'num'; const FILTER_ACTIVITY_TAGS = 'tg'; const SORT_HIT = 'hit'; const SORT_DATE_CREATED = 'dateCreated'; const SORT_DATE_START = 'dateStart'; Loading Loading @@ -104,6 +107,7 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U self::FILTER_ACTIVITY_TYPE => 'Type - est de type', self::FILTER_ACTIVITY_TYPE_OUT => 'Type - n\'est pas de type', self::FILTER_ACTIVITY_DISCIPLINE => 'Ayant pour discipline', self::FILTER_ACTIVITY_TAGS => 'Ayant pour mot-clef', self::FILTER_ACTIVITY_MILESTONE => 'Ayant le jalon', self::FILTER_ACTIVITY_DOCUMENT_TYPE => 'Ayant ce type de document', self::FILTER_ACTIVITY_TIMESHEET => 'Activités soumise à feuille de temps', Loading Loading @@ -270,7 +274,7 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U } $param['val1'] = $value1; break; case 'tg' : case 'om' : // TODO extraction d'un tableau d'entiers positifs $value1 = explode(',', $filterParams[1]); Loading Loading @@ -769,6 +773,17 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U $filter['error'] = "Impossible de filtrer sur les disciplines"; } break; case 'tg' : try { $filteredIds = $this->getProjectGrantService()->getActivityRepository()->getIdsMotclefs( $value1 ); } catch (Exception $e) { $this->getLoggerService()->warning($e->getMessage()); $filter['error'] = "Impossible de filtrer sur les mots-clefs"; } break; ///////////////////////////////// ACTIVITE / JALON case 'aj': Loading Loading @@ -1058,7 +1073,8 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U } $activities = $json; } // var_dump($this->getFilterOptionsTags()); // die(); $output = [ "params_requested" => $params, "errors" => null, Loading @@ -1080,6 +1096,7 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U 'sortDirection' => $params['sortDirection'], 'sortIgnoreNull' => $params['sortIgnoreNull'], // Valeurs pour les champs de formulaire 'tags' => $this->getFilterOptionsTags(), 'filtersType' => $this->getFiltersTypes(), 'fieldsCSV' => $this->getFilterOptionsFieldCSV(), 'typeorgas' => $this->getFilterOptionsOrganizationTypes(), Loading Loading @@ -1247,4 +1264,11 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U { return $this->getProjectGrantService()->getOrganizationService(); } private function getFilterOptionsTags() { /** @var ActivityMotCleRepository $repo */ $repo = $this->getEntityManager()->getRepository(ActivityMotCle::class); return $repo->getAllArray(); } } module/Oscar/view/oscar/project-grant/advanced-search.phtml +25 −0 Original line number Diff line number Diff line Loading @@ -209,6 +209,27 @@ </article> </script> <script type="text/x-handlebars" id="tags-criteria-tpl"> <article class="criteria criteria-type card"> <div class="icon-tags"></div> {{#if error}}<strong class="text-danger"><i class="icon-attention-1"></i> {{error}}</strong>{{/if}} <input type="hidden" name="criteria[]" class="criteria" value="{{criteria}}"/> <small>{{typeLabel}}</small> <select class="select2 form-control val1 changer types" id="filter_tags" multiple> <option></option> <?php foreach ($tags as $id => $label): ?> <option value="<?= $id ?>"><?= $label ?></option> <?php endforeach; ?> </select> <nav> <a href="#" class="delete"> <i class="icon-cancel-outline"></i> </a> </nav> </article> </script> <script type="text/x-handlebars" id="country-tpl"> <article class="criteria criteria-country card"> <div class="icon-tag"></div> Loading Loading @@ -904,6 +925,9 @@ else if(datas.type == 'ds'){ dom = $(tplDiscipline(datas)); } else if(datas.type == 'tg'){ dom = $(tplTags(datas)); } else { console.error("le type", datas.type, "n'est pas pris en charge", datas); return; Loading Loading @@ -1165,6 +1189,7 @@ tplFinance = Handlebars.compile($('#finance-criteria-tpl').html()), tplType = Handlebars.compile($('#type-criteria-tpl').html()), tplDiscipline = Handlebars.compile($('#discipline-criteria-tpl').html()), tplTags = Handlebars.compile($('#tags-criteria-tpl').html()), tplStatic = Handlebars.compile($('#static-criteria-tpl').html()), tplNumber = Handlebars.compile($('#number-criteria-tpl').html()), tplPersons = Handlebars.compile($('#persons-criteria-tpl').html()), Loading Loading
module/Oscar/src/Oscar/Entity/ActivityMotCleRepository.php +11 −1 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ class ActivityMotCleRepository extends EntityRepository /** * Retourne tous les mots clés * * @return array * @return ActivityMotCle[] */ public function getAll(){ $query = $this->createQueryBuilder('m') Loading @@ -20,4 +20,14 @@ class ActivityMotCleRepository extends EntityRepository return $query->getQuery()->getResult(); } /** * @return array */ public function getAllArray(){ $out = []; foreach ($this->getAll() as $activityMotCle) { $out[$activityMotCle->getId()] = $activityMotCle->getLabel(); } return $out; } }
module/Oscar/src/Oscar/Entity/ActivityRepository.php +11 −0 Original line number Diff line number Diff line Loading @@ -1191,4 +1191,15 @@ class ActivityRepository extends EntityRepository } return array_map('current', $qb->getQuery()->getResult()); } public function getIdsMotclefs(mixed $motclefsIds) { $qb = $this->getEntityManager()->createQueryBuilder() ->select('DISTINCT c.id') ->from(Activity::class, 'c') ->innerJoin('c.motscles', 'm') ->where('m IN (:motcles)') ->setParameter('motcles', $motclefsIds); return array_map('current', $qb->getQuery()->getResult()); } } No newline at end of file
module/Oscar/src/Oscar/Service/ProjectGrantSearchService.php +26 −2 Original line number Diff line number Diff line Loading @@ -6,6 +6,8 @@ use Doctrine\ORM\Exception\NotSupported; use Exception; use Laminas\Http\Request; use Oscar\Entity\Activity; use Oscar\Entity\ActivityMotCle; use Oscar\Entity\ActivityMotCleRepository; use Oscar\Entity\DateType; use Oscar\Entity\Person; use Oscar\Entity\Project; Loading Loading @@ -63,6 +65,7 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U const FILTER_ACTIVITY_MILESTONE = 'aj'; const FILTER_ACTIVITY_ACCOUNT = 'cb'; const FILTER_ACTIVITY_NUMBERS = 'num'; const FILTER_ACTIVITY_TAGS = 'tg'; const SORT_HIT = 'hit'; const SORT_DATE_CREATED = 'dateCreated'; const SORT_DATE_START = 'dateStart'; Loading Loading @@ -104,6 +107,7 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U self::FILTER_ACTIVITY_TYPE => 'Type - est de type', self::FILTER_ACTIVITY_TYPE_OUT => 'Type - n\'est pas de type', self::FILTER_ACTIVITY_DISCIPLINE => 'Ayant pour discipline', self::FILTER_ACTIVITY_TAGS => 'Ayant pour mot-clef', self::FILTER_ACTIVITY_MILESTONE => 'Ayant le jalon', self::FILTER_ACTIVITY_DOCUMENT_TYPE => 'Ayant ce type de document', self::FILTER_ACTIVITY_TIMESHEET => 'Activités soumise à feuille de temps', Loading Loading @@ -270,7 +274,7 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U } $param['val1'] = $value1; break; case 'tg' : case 'om' : // TODO extraction d'un tableau d'entiers positifs $value1 = explode(',', $filterParams[1]); Loading Loading @@ -769,6 +773,17 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U $filter['error'] = "Impossible de filtrer sur les disciplines"; } break; case 'tg' : try { $filteredIds = $this->getProjectGrantService()->getActivityRepository()->getIdsMotclefs( $value1 ); } catch (Exception $e) { $this->getLoggerService()->warning($e->getMessage()); $filter['error'] = "Impossible de filtrer sur les mots-clefs"; } break; ///////////////////////////////// ACTIVITE / JALON case 'aj': Loading Loading @@ -1058,7 +1073,8 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U } $activities = $json; } // var_dump($this->getFilterOptionsTags()); // die(); $output = [ "params_requested" => $params, "errors" => null, Loading @@ -1080,6 +1096,7 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U 'sortDirection' => $params['sortDirection'], 'sortIgnoreNull' => $params['sortIgnoreNull'], // Valeurs pour les champs de formulaire 'tags' => $this->getFilterOptionsTags(), 'filtersType' => $this->getFiltersTypes(), 'fieldsCSV' => $this->getFilterOptionsFieldCSV(), 'typeorgas' => $this->getFilterOptionsOrganizationTypes(), Loading Loading @@ -1247,4 +1264,11 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U { return $this->getProjectGrantService()->getOrganizationService(); } private function getFilterOptionsTags() { /** @var ActivityMotCleRepository $repo */ $repo = $this->getEntityManager()->getRepository(ActivityMotCle::class); return $repo->getAllArray(); } }
module/Oscar/view/oscar/project-grant/advanced-search.phtml +25 −0 Original line number Diff line number Diff line Loading @@ -209,6 +209,27 @@ </article> </script> <script type="text/x-handlebars" id="tags-criteria-tpl"> <article class="criteria criteria-type card"> <div class="icon-tags"></div> {{#if error}}<strong class="text-danger"><i class="icon-attention-1"></i> {{error}}</strong>{{/if}} <input type="hidden" name="criteria[]" class="criteria" value="{{criteria}}"/> <small>{{typeLabel}}</small> <select class="select2 form-control val1 changer types" id="filter_tags" multiple> <option></option> <?php foreach ($tags as $id => $label): ?> <option value="<?= $id ?>"><?= $label ?></option> <?php endforeach; ?> </select> <nav> <a href="#" class="delete"> <i class="icon-cancel-outline"></i> </a> </nav> </article> </script> <script type="text/x-handlebars" id="country-tpl"> <article class="criteria criteria-country card"> <div class="icon-tag"></div> Loading Loading @@ -904,6 +925,9 @@ else if(datas.type == 'ds'){ dom = $(tplDiscipline(datas)); } else if(datas.type == 'tg'){ dom = $(tplTags(datas)); } else { console.error("le type", datas.type, "n'est pas pris en charge", datas); return; Loading Loading @@ -1165,6 +1189,7 @@ tplFinance = Handlebars.compile($('#finance-criteria-tpl').html()), tplType = Handlebars.compile($('#type-criteria-tpl').html()), tplDiscipline = Handlebars.compile($('#discipline-criteria-tpl').html()), tplTags = Handlebars.compile($('#tags-criteria-tpl').html()), tplStatic = Handlebars.compile($('#static-criteria-tpl').html()), tplNumber = Handlebars.compile($('#number-criteria-tpl').html()), tplPersons = Handlebars.compile($('#persons-criteria-tpl').html()), Loading