From 76a23a81a133c4d61e03bfe0e5fbca14f370277a Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Wed, 24 Oct 2018 14:49:37 +0200
Subject: [PATCH] FEAT #8550 OnlyContacts for autocompletion

---
 apps/maarch_entreprise/actions/index_mlb.php  |   4 +-
 .../actions/validate_mail.php                 |   4 +-
 .../indexing_searching/details.php            |   4 +-
 .../indexing_searching/search_adv.php         |   8 +-
 apps/maarch_entreprise/js/functions.js        |   6 +-
 apps/maarch_entreprise/js/indexing.js         |   6 +-
 rest/index.php                                |   1 +
 .../controllers/AutoCompleteController.php    | 110 +++++++++++++++---
 ...contacts-group-administration.component.ts |   2 +-
 src/frontend/app/profile.component.ts         |   2 +-
 10 files changed, 115 insertions(+), 32 deletions(-)

diff --git a/apps/maarch_entreprise/actions/index_mlb.php b/apps/maarch_entreprise/actions/index_mlb.php
index 5dcc1ba26a2..ffe14c3177d 100755
--- a/apps/maarch_entreprise/actions/index_mlb.php
+++ b/apps/maarch_entreprise/actions/index_mlb.php
@@ -691,7 +691,7 @@ function get_form_txt($values, $pathManageAction, $actionId, $table, $module, $c
     $frmStr .= '</label></td>';
     $frmStr .= '<td>&nbsp;</td>';
     $frmStr .= '<td class="indexing_field">';
-    $frmStr .= '<i id="sender_recipient_icon_contactsUsers" class="fa fa-user" onclick="switchAutoCompleteType(\'sender_recipient\',\'contactsUsers\');" style="color:#135F7F;display: inline-block;cursor:pointer;" title="'._CONTACTS_USERS_LIST.'" ></i> <i id="sender_recipient_icon_entities" class="fa fa-sitemap" onclick="switchAutoCompleteType(\'sender_recipient\',\'entities\');" style="display: inline-block;cursor:pointer;" title="'._ENTITIES_LIST.'" ></i>';
+    $frmStr .= '<i id="sender_recipient_icon_contactsUsers" class="fa fa-user" onclick="switchAutoCompleteType(\'sender_recipient\',\'contactsUsers\', false);" style="color:#135F7F;display: inline-block;cursor:pointer;" title="'._CONTACTS_USERS_LIST.'" ></i> <i id="sender_recipient_icon_entities" class="fa fa-sitemap" onclick="switchAutoCompleteType(\'sender_recipient\',\'entities\');" style="display: inline-block;cursor:pointer;" title="'._ENTITIES_LIST.'" ></i>';
     $frmStr .= '<div class="typeahead__container"><div class="typeahead__field"><span class="typeahead__query">';
     $frmStr .= '<input name="sender_recipient" type="text" id="sender_recipient" autocomplete="off" placeholder="'._CONTACTS_USERS_SEARCH.'"/></span></div></div>';
     $frmStr .= '</td><td></td>';
@@ -1047,7 +1047,7 @@ function get_form_txt($values, $pathManageAction, $actionId, $table, $module, $c
                 . 'true&page=autocomplete_department_number\','
                 . ' \'Input\', \'2\', \'department_number_id\');';
 
-    $frmStr .= 'initSenderRecipientAutocomplete(\'sender_recipient\',\'contactsUsers\');';
+    $frmStr .= 'initSenderRecipientAutocomplete(\'sender_recipient\',\'contactsUsers\', false);';
 
     $frmStr .= '$j(\'#baskets\').css(\'visibility\',\'hidden\');'
             .'var item  = $j(\'#index_div\')[0]; if(item)'
diff --git a/apps/maarch_entreprise/actions/validate_mail.php b/apps/maarch_entreprise/actions/validate_mail.php
index 98938258087..27d3f44a3dc 100755
--- a/apps/maarch_entreprise/actions/validate_mail.php
+++ b/apps/maarch_entreprise/actions/validate_mail.php
@@ -829,7 +829,7 @@ function get_form_txt($values, $path_manage_action, $id_action, $table, $module,
     $frm_str .= '</label></td>';
     $frm_str .= '<td>&nbsp;</td>';
     $frm_str .= '<td class="indexing_field">';
-    $frm_str .= '<i id="sender_recipient_icon_contactsUsers" class="fa fa-user" onclick="switchAutoCompleteType(\'sender_recipient\',\'contactsUsers\');" style="color:#135F7F;display: inline-block;cursor:pointer;" title="'._CONTACTS_USERS_LIST.'" ></i> <i id="sender_recipient_icon_entities" class="fa fa-sitemap" onclick="switchAutoCompleteType(\'sender_recipient\',\'entities\');" style="display: inline-block;cursor:pointer;" title="'._ENTITIES_LIST.'" ></i>';
+    $frm_str .= '<i id="sender_recipient_icon_contactsUsers" class="fa fa-user" onclick="switchAutoCompleteType(\'sender_recipient\',\'contactsUsers\', false);" style="color:#135F7F;display: inline-block;cursor:pointer;" title="'._CONTACTS_USERS_LIST.'" ></i> <i id="sender_recipient_icon_entities" class="fa fa-sitemap" onclick="switchAutoCompleteType(\'sender_recipient\',\'entities\');" style="display: inline-block;cursor:pointer;" title="'._ENTITIES_LIST.'" ></i>';
     $frm_str .= '<div class="typeahead__container"><div class="typeahead__field"><span class="typeahead__query">';
     $frm_str .= '<input name="sender_recipient" type="text" id="sender_recipient" autocomplete="off"';
     if (!empty($sr['format'])) {
@@ -1406,7 +1406,7 @@ function get_form_txt($values, $path_manage_action, $id_action, $table, $module,
         .$_SESSION['config']['businessappurl']
         .'index.php?display=true&dir=indexing_searching&page=autocomplete_contacts_prepare_multi\');';
     $frm_str .= 'affiche_reference();';
-    $frm_str .= 'initSenderRecipientAutocomplete(\'sender_recipient\',\'contactsUsers\');';
+    $frm_str .= 'initSenderRecipientAutocomplete(\'sender_recipient\',\'contactsUsers\', false);';
     $frm_str .= 'initList_hidden_input(\'department_number\', \'show_department_number\',\''
          . $_SESSION['config']['businessappurl'] . 'index.php?display='
          . 'true&page=autocomplete_department_number\','
diff --git a/apps/maarch_entreprise/indexing_searching/details.php b/apps/maarch_entreprise/indexing_searching/details.php
index 1184e92c95f..b65aa0e9a4d 100755
--- a/apps/maarch_entreprise/indexing_searching/details.php
+++ b/apps/maarch_entreprise/indexing_searching/details.php
@@ -785,7 +785,7 @@ if ($stmt->rowCount() == 0) {
                         }
                     }
                     if (empty($disabledAttr)) {
-                        echo '<i id="sender_recipient_icon_contactsUsers" class="fa fa-user" onclick="switchAutoCompleteType(\'sender_recipient\',\'contactsUsers\');" style="color:#135F7F;display: inline-block;cursor:pointer;" title="'._CONTACTS_USERS_LIST.'" ></i> <i id="sender_recipient_icon_entities" class="fa fa-sitemap" onclick="switchAutoCompleteType(\'sender_recipient\',\'entities\');" style="display: inline-block;cursor:pointer;" title="'._ENTITIES_LIST.'" ></i>';
+                        echo '<i id="sender_recipient_icon_contactsUsers" class="fa fa-user" onclick="switchAutoCompleteType(\'sender_recipient\',\'contactsUsers\', false);" style="color:#135F7F;display: inline-block;cursor:pointer;" title="'._CONTACTS_USERS_LIST.'" ></i> <i id="sender_recipient_icon_entities" class="fa fa-sitemap" onclick="switchAutoCompleteType(\'sender_recipient\',\'entities\');" style="display: inline-block;cursor:pointer;" title="'._ENTITIES_LIST.'" ></i>';
                         if ($sr['type'] == 'entity') {
                             echo '<script>$j("#sender_recipient_icon_contactsUsers").css({"color":"#666"});</script>';
                             echo '<script>$j("#sender_recipient_icon_entities").css({"color":"#135F7F"});</script>';
@@ -813,7 +813,7 @@ if ($stmt->rowCount() == 0) {
                     echo "/>";
 
                     //initialize autocomplete
-                    echo '<script>initSenderRecipientAutocomplete(\'sender_recipient\',\'contactsUsers\');</script>';
+                    echo '<script>initSenderRecipientAutocomplete(\'sender_recipient\',\'contactsUsers\', false);</script>';
 
                 } else {
                     echo "<input type='text' name='{$key}' id='{$key}' value='{$inputValue}' title='{$inputValue}' alt='{$inputValue}' size='40' class='{$disabledClass}' {$disabledAttr}/>";
diff --git a/apps/maarch_entreprise/indexing_searching/search_adv.php b/apps/maarch_entreprise/indexing_searching/search_adv.php
index b43c3fcdb4e..2161cbf5fa6 100755
--- a/apps/maarch_entreprise/indexing_searching/search_adv.php
+++ b/apps/maarch_entreprise/indexing_searching/search_adv.php
@@ -624,7 +624,7 @@ if ($core_tools->is_module_loaded('basket') == true) {
                 <label for="sender" class="bold"><?php echo _SENDER; ?></label>
             </div>
             <div class="adv_search_field indexing_field">
-            <i id="sender_icon_contactsUsers" class="fa fa-user" onclick="switchAutoCompleteType('sender','contactsUsers');" style="color:#135F7F;display: inline-block;cursor:pointer;" title="<?php echo _CONTACTS_USERS_LIST; ?>" ></i> <i id="sender_icon_entities" class="fa fa-sitemap" onclick="switchAutoCompleteType('sender','entities');" style="display: inline-block;cursor:pointer;" title="<?php echo _ENTITIES_LIST; ?>" ></i>
+            <i id="sender_icon_contactsUsers" class="fa fa-user" onclick="switchAutoCompleteType('sender','contactsUsers', true);" style="color:#135F7F;display: inline-block;cursor:pointer;" title="<?php echo _CONTACTS_USERS_LIST; ?>" ></i> <i id="sender_icon_entities" class="fa fa-sitemap" onclick="switchAutoCompleteType('sender','entities');" style="display: inline-block;cursor:pointer;" title="<?php echo _ENTITIES_LIST; ?>" ></i>
                 <span style="position:relative;">
                     <div class="typeahead__container"><div class="typeahead__field">
                         <span class="typeahead__query">
@@ -634,7 +634,7 @@ if ($core_tools->is_module_loaded('basket') == true) {
                     </div></div>
                 </span>
                 <script type="text/javascript">
-                    initSenderRecipientAutocomplete('sender','contactsUsers');
+                    initSenderRecipientAutocomplete('sender','contactsUsers', true);
                 </script>
                 <input type="hidden" name="sender_id" id="sender_id" />
                 <input type="hidden" name="sender_type" id="sender_type" />
@@ -648,7 +648,7 @@ if ($core_tools->is_module_loaded('basket') == true) {
                 <label for="recipient" class="bold"><?php echo _DEST; ?></label>
             </div>
             <div class="adv_search_field indexing_field">
-            <i id="recipient_icon_contactsUsers" class="fa fa-user" onclick="switchAutoCompleteType('recipient','contactsUsers');" style="color:#135F7F;display: inline-block;cursor:pointer;" title="<?php echo _CONTACTS_USERS_LIST; ?>" ></i> <i id="recipient_icon_entities" class="fa fa-sitemap" onclick="switchAutoCompleteType('recipient','entities');" style="display: inline-block;cursor:pointer;" title="<?php echo _ENTITIES_LIST; ?>" ></i>
+            <i id="recipient_icon_contactsUsers" class="fa fa-user" onclick="switchAutoCompleteType('recipient','contactsUsers', true);" style="color:#135F7F;display: inline-block;cursor:pointer;" title="<?php echo _CONTACTS_USERS_LIST; ?>" ></i> <i id="recipient_icon_entities" class="fa fa-sitemap" onclick="switchAutoCompleteType('recipient','entities');" style="display: inline-block;cursor:pointer;" title="<?php echo _ENTITIES_LIST; ?>" ></i>
                 <span style="position:relative;">
                     <div class="typeahead__container"><div class="typeahead__field">
                         <span class="typeahead__query">
@@ -659,7 +659,7 @@ if ($core_tools->is_module_loaded('basket') == true) {
                     </div></div>
                 </span>
                 <script type="text/javascript">
-                    initSenderRecipientAutocomplete('recipient', 'contactsUsers');
+                    initSenderRecipientAutocomplete('recipient', 'contactsUsers', true);
                 </script>
                 <input type="hidden" name="recipient_id" id="recipient_id" />
                 <input type="hidden" name="recipient_type" id="recipient_type" />
diff --git a/apps/maarch_entreprise/js/functions.js b/apps/maarch_entreprise/js/functions.js
index 2a4ba6aa9cb..7a44711ef96 100755
--- a/apps/maarch_entreprise/js/functions.js
+++ b/apps/maarch_entreprise/js/functions.js
@@ -3854,19 +3854,19 @@ function contactMapping(fieldsCtrl, formId) {
     }
 }
 
-function switchAutoCompleteType(id, mode) {
+function switchAutoCompleteType(id, mode, alternateVersion) {
     if (mode == 'contactsUsers') {
         $j('#'+id+'_icon_contactsUsers').css({'color' : '#135F7F'});
         $j('#'+id+'_icon_entities').css({'color' : '#666'});
         $j('#'+id+'').attr('placeholder','Rechercher un contact / utilisateur');
         $j(".typeahead__result").remove();
-        initSenderRecipientAutocomplete(id, 'contactsUsers');
+        initSenderRecipientAutocomplete(id, 'contactsUsers', alternateVersion);
     } else {
         $j('#'+id+'_icon_contactsUsers').css({'color' : '#666'});
         $j('#'+id+'_icon_entities').css({'color' : '#135F7F'});
         $j('#'+id+'').attr('placeholder','Rechercher une entité');
         $j(".typeahead__result").remove();
-        initSenderRecipientAutocomplete(id, 'entities');
+        initSenderRecipientAutocomplete(id, 'entities', alternateVersion);
     }
     $j('#'+id).val('');
     $j('#'+id+'_id').val('');
diff --git a/apps/maarch_entreprise/js/indexing.js b/apps/maarch_entreprise/js/indexing.js
index 0e70167da8d..04de4bd2829 100755
--- a/apps/maarch_entreprise/js/indexing.js
+++ b/apps/maarch_entreprise/js/indexing.js
@@ -1942,7 +1942,7 @@ function delIndexingModel() {
     }
 }
 
-function initSenderRecipientAutocomplete(inputId, mode) {
+function initSenderRecipientAutocomplete(inputId, mode, alternateVersion) {
     var route = '';
     if (mode == 'contactsUsers') {
         route = '../../rest/autocomplete/contactsUsers';
@@ -1964,7 +1964,9 @@ function initSenderRecipientAutocomplete(inputId, mode) {
                     type: "GET",
                     url: route,
                     data: {
-                        search : query
+                        search : query,
+                        onlyContacts : alternateVersion,
+                        color : !alternateVersion
                     }
                 }
             }
diff --git a/rest/index.php b/rest/index.php
index 20a237be58d..2b958046d62 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -71,6 +71,7 @@ $app->get('/administration', \SrcCore\controllers\CoreController::class . ':getA
 $app->get('/autocomplete/contacts', \SrcCore\controllers\AutoCompleteController::class . ':getContacts');
 $app->get('/autocomplete/users', \SrcCore\controllers\AutoCompleteController::class . ':getUsers');
 $app->get('/autocomplete/contactsUsers', \SrcCore\controllers\AutoCompleteController::class . ':getContactsAndUsers');
+$app->get('/autocomplete/contacts/groups', \SrcCore\controllers\AutoCompleteController::class . ':getContactsForGroups');
 $app->get('/autocomplete/users/administration', \SrcCore\controllers\AutoCompleteController::class . ':getUsersForAdministration');
 $app->get('/autocomplete/users/visa', \SrcCore\controllers\AutoCompleteController::class . ':getUsersForVisa');
 $app->get('/autocomplete/entities', \SrcCore\controllers\AutoCompleteController::class . ':getEntities');
diff --git a/src/core/controllers/AutoCompleteController.php b/src/core/controllers/AutoCompleteController.php
index 567d080beaf..a0ad28d543d 100644
--- a/src/core/controllers/AutoCompleteController.php
+++ b/src/core/controllers/AutoCompleteController.php
@@ -38,7 +38,6 @@ class AutoCompleteController
         $data = $request->getQueryParams();
 
         $check = Validator::stringType()->notEmpty()->validate($data['search']);
-        $check = $check && Validator::stringType()->notEmpty()->validate($data['type']);
         if (!$check) {
             return $response->withStatus(400)->withJson(['errors' => 'Bad Request']);
         }
@@ -49,10 +48,6 @@ class AutoCompleteController
                     OR address_num ilike ? OR address_street ilike ? OR address_town ilike ? OR address_postal_code ilike ?)';
         $where = [];
         $requestData = [];
-        if ($data['type'] != 'all') {
-            $where = ['contact_type = ?'];
-            $requestData = [$data['type']];
-        }
         foreach ($searchItems as $item) {
             if (strlen($item) >= 2) {
                 $where[] = $fields;
@@ -63,21 +58,19 @@ class AutoCompleteController
         }
 
         $contacts = ContactModel::getOnView([
-            'select'    => [
-                'ca_id', 'firstname', 'lastname', 'contact_lastname', 'contact_firstname', 'society', 'address_num',
-                'address_street', 'address_town', 'address_postal_code', 'is_corporate_person'
-            ],
+            'select'    => ['*'],
             'where'     => $where,
             'data'      => $requestData,
-            'limit'     => 1000
+            'limit'     => self::TINY_LIMIT
         ]);
 
-        $data = [];
+        $color = (!empty($data['color']) && $data['color'] == 'true');
+        $autocompleteData = [];
         foreach ($contacts as $contact) {
-            $data[] = ContactGroupController::getFormattedContact(['contact' => $contact])['contact'];
+            $autocompleteData[] = AutoCompleteController::getFormattedContact(['contact' => $contact, 'color' => $color])['contact'];
         }
 
-        return $response->withJson($data);
+        return $response->withJson($autocompleteData);
     }
 
     public static function getUsers(Request $request, Response $response)
@@ -150,9 +143,16 @@ class AutoCompleteController
             'limit'     => self::TINY_LIMIT
         ]);
 
+        $color = (!empty($data['color']) && $data['color'] == 'true');
+
+        $onlyContacts = [];
         $autocompleteData = [];
         foreach ($contacts as $contact) {
-            $autocompleteData[] = AutoCompleteController::getFormattedContact(['contact' => $contact])['contact'];
+            if (!empty($data['onlyContacts']) && $data['onlyContacts'] == 'true' && !in_array($contact['contact_id'], $onlyContacts)) {
+                $autocompleteData[] = AutoCompleteController::getFormattedOnlyContact(['contact' => $contact])['contact'];
+                $onlyContacts[] = $contact['contact_id'];
+            }
+            $autocompleteData[] = AutoCompleteController::getFormattedContact(['contact' => $contact, 'color' => $color])['contact'];
         }
 
         $excludedUsers = ['superadmin'];
@@ -377,6 +377,53 @@ class AutoCompleteController
         return $response->withJson($data);
     }
 
+    public static function getContactsForGroups(Request $request, Response $response)
+    {
+        $data = $request->getQueryParams();
+
+        $check = Validator::stringType()->notEmpty()->validate($data['search']);
+        $check = $check && Validator::stringType()->notEmpty()->validate($data['type']);
+        if (!$check) {
+            return $response->withStatus(400)->withJson(['errors' => 'Bad Request']);
+        }
+
+        $searchItems = explode(' ', $data['search']);
+
+        $fields = '(contact_firstname ilike ? OR contact_lastname ilike ? OR firstname ilike ? OR lastname ilike ? OR society ilike ? 
+                    OR address_num ilike ? OR address_street ilike ? OR address_town ilike ? OR address_postal_code ilike ?)';
+        $where = [];
+        $requestData = [];
+        if ($data['type'] != 'all') {
+            $where = ['contact_type = ?'];
+            $requestData = [$data['type']];
+        }
+        foreach ($searchItems as $item) {
+            if (strlen($item) >= 2) {
+                $where[] = $fields;
+                for ($i = 0; $i < 9; $i++) {
+                    $requestData[] = "%{$item}%";
+                }
+            }
+        }
+
+        $contacts = ContactModel::getOnView([
+            'select'    => [
+                'ca_id', 'firstname', 'lastname', 'contact_lastname', 'contact_firstname', 'society', 'address_num',
+                'address_street', 'address_town', 'address_postal_code', 'is_corporate_person'
+            ],
+            'where'     => $where,
+            'data'      => $requestData,
+            'limit'     => 1000
+        ]);
+
+        $data = [];
+        foreach ($contacts as $contact) {
+            $data[] = ContactGroupController::getFormattedContact(['contact' => $contact])['contact'];
+        }
+
+        return $response->withJson($data);
+    }
+
     public static function getBanAddresses(Request $request, Response $response)
     {
         $data = $request->getQueryParams();
@@ -461,8 +508,11 @@ class AutoCompleteController
     {
         ValidatorModel::notEmpty($aArgs, ['contact']);
         ValidatorModel::arrayType($aArgs, ['contact']);
+        ValidatorModel::boolType($aArgs, ['color']);
 
-        $rate = ContactController::getFillingRate(['contact' => $aArgs['contact']]);
+        if (!empty($aArgs['color'])) {
+            $rate = ContactController::getFillingRate(['contact' => $aArgs['contact']]);
+        }
         $rateColor = empty($rate['color']) ? '' : $rate['color'];
 
         $address = '';
@@ -524,4 +574,34 @@ class AutoCompleteController
 
         return ['contact' => $contact];
     }
+
+    public static function getFormattedOnlyContact(array $aArgs)
+    {
+        ValidatorModel::notEmpty($aArgs, ['contact']);
+        ValidatorModel::arrayType($aArgs, ['contact']);
+
+        if ($aArgs['contact']['is_corporate_person'] == 'Y') {
+            $contact = [
+                'type'          => 'onlyContact',
+                'id'            => $aArgs['contact']['contact_id'],
+                'idToDisplay'   => $aArgs['contact']['society'],
+                'otherInfo'     => $aArgs['contact']['society'],
+                'rateColor'     => ''
+            ];
+        } else {
+            $contactToDisplay = "{$aArgs['contact']['contact_firstname']} {$aArgs['contact']['contact_lastname']}";
+            if (!empty($aArgs['contact']['society'])) {
+                $contactToDisplay .= " ({$aArgs['contact']['society']})";
+            }
+            $contact = [
+                'type'          => 'onlyContact',
+                'id'            => $aArgs['contact']['contact_id'],
+                'idToDisplay'   => $contactToDisplay,
+                'otherInfo'     => $contactToDisplay,
+                'rateColor'     => ''
+            ];
+        }
+
+        return ['contact' => $contact];
+    }
 }
diff --git a/src/frontend/app/administration/contact/contacts-group-administration.component.ts b/src/frontend/app/administration/contact/contacts-group-administration.component.ts
index 3c5b51c12aa..497f9194fda 100755
--- a/src/frontend/app/administration/contact/contacts-group-administration.component.ts
+++ b/src/frontend/app/administration/contact/contacts-group-administration.component.ts
@@ -81,7 +81,7 @@ export class ContactsGroupAdministrationComponent implements OnInit {
             debounceTime(500),
             filter(value => value.length > 2),
             distinctUntilChanged(),
-            switchMap(data => this.http.get(this.coreUrl + 'rest/autocomplete/contacts', { params: { "search": data, "type": this.contactTypeSearch } }))
+            switchMap(data => this.http.get(this.coreUrl + 'rest/autocomplete/contacts/groups', { params: { "search": data, "type": this.contactTypeSearch } }))
         ).subscribe((response: any) => {
             this.searchResult = response;
             this.dataSource = new MatTableDataSource(this.searchResult);
diff --git a/src/frontend/app/profile.component.ts b/src/frontend/app/profile.component.ts
index 80158a92996..a20c786335b 100755
--- a/src/frontend/app/profile.component.ts
+++ b/src/frontend/app/profile.component.ts
@@ -174,7 +174,7 @@ export class ProfileComponent extends AutoCompletePlugin implements OnInit {
             debounceTime(500),
             filter(value => value.length > 2),
             distinctUntilChanged(),
-            switchMap(data => this.http.get(this.coreUrl + 'rest/autocomplete/contacts', { params: { "search": data, "type": this.contactTypeSearch } }))
+            switchMap(data => this.http.get(this.coreUrl + 'rest/autocomplete/contacts/groups', { params: { "search": data, "type": this.contactTypeSearch } }))
         ).subscribe((response: any) => {
             this.searchResult = response;
             this.dataSourceContactsListAutocomplete = new MatTableDataSource(this.searchResult);
-- 
GitLab