Commit 7b04e70a authored by Stephane Bouvry's avatar Stephane Bouvry
Browse files

- Up : Ajout d'un critère de recherche sur les Mots-cles

parent 36a248bf
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -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')
@@ -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;
    }
}
+11 −0
Original line number Diff line number Diff line
@@ -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
+26 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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';
@@ -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',
@@ -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]);
@@ -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':
@@ -1058,7 +1073,8 @@ class ProjectGrantSearchService implements UseEntityManager, UsePersonService, U
            }
            $activities = $json;
        }

//        var_dump($this->getFilterOptionsTags());
//        die();
        $output = [
            "params_requested"       => $params,
            "errors"                 => null,
@@ -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(),
@@ -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();
    }
}
+25 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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;
@@ -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()),