Projet

Général

Profil

Bug #18916

affichage "asynchrone" des résultats de la celule recherche

Ajouté par Thomas Noël il y a plus de 6 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
23 septembre 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

La cellule recherche affiche les résultats en temps réel. Pour cela, on lance une recherche quelques dixièmes de seconde après chaque touche frappée. Et on affiche alors le résultat.

Or le cas suivant peut se produire :
  • je tape "to" dans la zone de recherche
  • une requête R1 de recherche est lancée
  • je tape "toto" dans la zone de recherche
  • une requête R2 de recherche est lancée

Si la requête R1 mets plus de temps à répondre que R2, alors elle se retrouve affichée après l'affichage du résultat de R2 (qui est donc remplacé). D'où incohérence.


Fichiers

Révisions associées

Révision ec6fb3d1 (diff)
Ajouté par Thomas Noël il y a plus de 6 ans

search cell: display only results of the last request (#18916)

Historique

#2

Mis à jour par Frédéric Péters il y a plus de 6 ans

Dans l'idée je pense que ce bout pourrait le faire. (absolument pas testé)

--- a/combo/apps/search/templates/combo/search-cell.html
+++ b/combo/apps/search/templates/combo/search-cell.html
@@ -14,11 +14,14 @@ $(function() {
   var combo_search_form_{{ cell.pk }} = $('#combo-search-form-{{ cell.pk }}');
   var combo_search_input_{{ cell.pk }} = $('#combo-search-input-{{ cell.pk }}');
   var combo_search_results_{{ cell.pk }} = $('#combo-search-results-{{ cell.pk }}');
+  var xhr = null;

   function combo_search_update_{{ cell.pk }}() {
-    $.get(combo_search_input_{{ cell.pk }}.data('autocomplete-json'),
+    if (xhr) xhr.abort();
+    xhr = $.get(combo_search_input_{{ cell.pk }}.data('autocomplete-json'),
       {'q': combo_search_input_{{ cell.pk }}.val()},
       function (response) {
+        xhr = null;
         combo_search_results_{{ cell.pk }}.html(response);
       }
     );

(mais je n'aime pas trop ce js avec des bouts de template django dedans, en plus ça me semble pour une part inutile vu que les variables sont limitées au scope de la fonction.)

#3

Mis à jour par Thomas Noël il y a plus de 6 ans

L'idée de Benjamin dans #18731, une fois que je l'ai comprise, me semble la bonne.

Sans doute à tester "en vrai" sur la preprod de Nanterre où le problème est facilement visible, avant de valider vraiment.

#4

Mis à jour par Thomas Noël il y a plus de 6 ans

Frédéric Péters a écrit :

Dans l'idée je pense que ce bout pourrait le faire. (absolument pas testé)

C'est la même idée que benj, mais ton code m'est plus lisible.

(mais je n'aime pas trop ce js avec des bouts de template django dedans, en plus ça me semble pour une part inutile vu que les variables sont limitées au scope de la fonction.)

Je me demande ce que faisait le relecteur de #15085 ;)

#6

Mis à jour par Frédéric Péters il y a plus de 6 ans

Bien sûr je suis d'accord avec le code, mais on attend validation côté Nanterre que ça marche pour eux ?

#7

Mis à jour par Thomas Noël il y a plus de 6 ans

  • Statut changé de En cours à Résolu (à déployer)

Frédéric Péters a écrit :

Bien sûr je suis d'accord avec le code, mais on attend validation côté Nanterre que ça marche pour eux ?

Non, je pushe.

(Mais je pense qu'à Nanterre il y a d'autres soucis, liés à la lenteur avec lequel le résultat arrive (plus de 1 seconde) qui donne un comportement étrange ; sans doute que l'abort devrait s'accompagner d'un nettoyage de la zone html des résultats. Et, globalement, on devrait avoir un petit sablier quelque part qui indique qu'une recherche est en cours.)

Je ferme ce ticket.

commit ec6fb3d109286616b0839ea3357a9825ec631e7b
Author: Thomas NOEL <tnoel@entrouvert.com>
Date:   Sun Sep 24 00:14:02 2017 +0200

    search cell: display only results of the last request (#18916)

#8

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF