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> </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> </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