Le défilement vers la catégorie actuelle est cassé depuis la 2.8.0.beta5

Dans les versions de Discourse antérieures à 2.8.0.beta5, si vous modifiez un sujet et cliquez sur la liste déroulante de sélection de catégorie, la catégorie actuelle est à la fois sélectionnée et descendue dans la liste des catégories, de sorte qu’elle est immédiatement visible en haut, et ses sous-catégories (le cas échéant) sont visibles. Le sujet peut alors être facilement déplacé dans une sous-catégorie plus appropriée.

Fonctionnement dans 2.8.0.beta4 et versions antérieures :

Depuis la version 2.8.0.beta5, la catégorie actuelle n’est plus atteinte lors de l’ouverture de la liste déroulante de sélection de catégorie :

J’espère que ces courtes démonstrations vidéo vous aideront à comprendre rapidement ce que j’essaie de décrire.

Remarque : dans mes exemples, j’ai activé les options “fixed category positions” et “fixed category positions on create”, cependant le comportement de défilement vers l’actuel est manquant avec ces options activées ou désactivées.

J’ai confirmé cela en développement local en installant 2.8.0.beta4 et en observant le comportement souhaité, puis en mettant à jour vers 2.8.0.beta5 et en observant que le comportement ne fonctionnait plus.

J’ai parcouru le code jusqu’à trouver que le commit important suivant impliquant select-kit.js est l’endroit où le changement a eu lieu (attendez un instant et il devrait sauter aux lignes de code en question) :

Le code suivant a été supprimé de la méthode _scrollToRow(), qui est appelée par la méthode _scrollToCurrent() :

if (rowContainer) {
  const collectionContainer = rowContainer.parentNode;

  collectionContainer.scrollTop =
    rowContainer.offsetTop - collectionContainer.offsetTop;
}

J’ai confirmé que le fait de réinsérer ce code dans select-kit.js dans 2.8.0.beta5 résout le problème, bien que comme il ne m’est pas clair pourquoi il a été supprimé, je ne suis pas sûr des autres effets secondaires possibles de son réinsertion.

Merci d’examiner cela, et j’espère que nous pourrons faire fonctionner à nouveau ce comportement dans une future version.

4 « J'aime »

Salut, merci pour ça :+1:

Je ne me souviens pas exactement pourquoi j’ai fait ça, mais d’après ce que je comprends actuellement, je pense que c’est aussi une erreur.

J’ai fait cette PR :

Si vous pouvez essayer ce code et me dire si vous pensez que ce serait suffisant pour vous, s’il vous plaît ?

Salut Joffrey, merci d’avoir examiné cela ! J’ai testé les derniers changements, mais il semble que cela n’ait pas fonctionné. Comme cela a été fusionné, j’ai confirmé sur la branche tests-passés.

Des deux commits dans la PR, le premier fonctionne (ab0fbf1), mais est annulé par le second (92943ff).

Le changement à la ligne 992 semble correct mais n’a pas l’effet escompté. Il semble avoir besoin du bloc de code qui a été supprimé et qui ajuste la valeur de collectionContainer.scrollTop.

Merci encore !

1 « J'aime »

Oui, je n’étais pas sûr si ce comportement serait suffisant. Je peux le rajouter demain. Pouvez-vous être plus précis sur ce qui ne vous plaît pas dans ce comportement maintenant, s’il vous plaît ?

Salut Joffrey,

Merci de continuer à examiner la question. Avec les modifications de code actuelles (je me suis assuré de récupérer le dernier code, de vider tmp et de redémarrer le serveur de développement), le comportement présent avant la version 2.8.0.beta5 n’est pas revenu. Il ne fait toujours plus défiler pour afficher la catégorie actuelle en haut des options visibles dans le menu déroulant.

Le comportement correct/désiré est celui montré dans la première vidéo de la publication originale, cependant, il fonctionne toujours comme dans la seconde vidéo. Actuellement, la barre de défilement commence toujours complètement en haut, quelle que soit la position de la catégorie actuelle dans les options.

La ligne rowContainer?.focus({ preventScroll }); semble n’avoir aucun effet dans ce cas, que preventScroll soit vrai, faux, ou même si la ligne entière est supprimée.

La ligne essentielle qui fait fonctionner le comportement (absente de la version actuelle) est :

collectionContainer.scrollTop =
          rowContainer.offsetTop - collectionContainer.offsetTop;

Sans cela, il ne défile pas à la bonne position, puisque scrollTop est égal à 0 par défaut. Après l’exécution de cette ligne, scrollTop est égal au bon nombre de pixels à faire défiler vers le bas.

J’espère que cela vous sera utile. N’hésitez pas à me faire savoir si je peux clarifier davantage.

Merci !

Oui, ce n’est pas en haut, mais c’est dans la fenêtre d’affichage, ce qui, selon moi, est suffisant.

Salut Joffrey,

Merci pour tes commentaires. J’ai ajouté plus de catégories à ma démo et confirmé que la catégorie actuelle apparaît maintenant dans la fenêtre d’affichage, c’est certainement une amélioration. Il serait toujours idéal qu’elle apparaisse en haut de la liste, comme avant. Cela garantirait que davantage de sous-catégories situées en dessous soient immédiatement visibles et que l’utilisateur puisse cliquer pour passer à une sous-catégorie sans avoir à faire défiler vers le bas pour les révéler. À mon avis, c’est un cas d’utilisation plus pertinent que de révéler des catégories adjacentes sans rapport. A-t-elle été centrée intentionnellement, ou s’agit-il d’une régression accidentelle du comportement précédent ? Dans tous les cas, c’est à toi de décider - je ne fais que donner mon avis.

Merci encore et j’apprécie ton travail acharné sur Discourse !