Rolagem para a categoria atual quebrada a partir de 2.8.0.beta5

Em versões do Discourse anteriores à 2.8.0.beta5, se você editar um tópico e clicar no menu suspenso de seleção de Categoria, a categoria atual é selecionada e rolada na lista de categorias, de modo que fique imediatamente visível no topo, e suas subcategorias (se houver) fiquem visíveis. O tópico pode então ser facilmente movido para uma subcategoria mais apropriada.

Funcionando em 2.8.0.beta4 e anteriores:

A partir da 2.8.0.beta5, a categoria atual não é mais rolada ao abrir o menu suspenso de seleção de Categoria:

Espero que estas curtas demonstrações em vídeo sejam úteis para mostrar rapidamente o que estou tentando descrever.

Nota: nos meus exemplos, tenho as opções “posições fixas de categoria” e “posições fixas de categoria na criação” ativadas, no entanto, a rolagem para o comportamento atual está faltando com essas opções ativadas ou desativadas.

Confirmei isso em desenvolvimento local instalando a 2.8.0.beta4 e observando o comportamento desejado, e depois atualizando para a 2.8.0.beta5 e observando que o comportamento não funcionava mais.

Vasculhei o código até encontrar o seguinte grande commit envolvendo select-kit.js onde a mudança ocorreu (espere um momento e ele deve pular para as linhas de código em questão):

O seguinte código foi removido do método _scrollToRow(), que é chamado pelo método _scrollToCurrent():

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

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

Confirmei que adicionar este código de volta ao select-kit.js na 2.8.0.beta5 corrige o problema, embora como não está claro para mim por que foi removido, estou incerto sobre outros possíveis efeitos colaterais de adicioná-lo de volta.

Obrigado por dar uma olhada nisso, e espero que possamos fazer esse comportamento funcionar novamente em uma versão futura.

4 curtidas

Olá, obrigado por isso :+1:

Não me lembro exatamente por que fiz isso, mas, pelo que entendi agora, acho que isso também é um erro.

Eu fiz este PR:

Se você puder testar este código e me dizer se acha que seria suficiente para você, por favor?

Olá Joffrey, obrigado por analisar isso! Testei as últimas alterações, mas parece que não funcionaram. Como foi mesclado, confirmei no branch tests-passed.

Dos dois commits no PR, o primeiro funciona (ab0fbf1), mas é substituído pelo segundo (92943ff).

A alteração na linha 992 parece boa, mas não tem o efeito esperado. Parece precisar do bloco de código que foi removido e que ajusta o valor de collectionContainer.scrollTop.

Obrigado novamente!

1 curtida

Sim, eu não tinha certeza se esse comportamento seria suficiente. Posso adicionar isso de volta amanhã. Você pode ser mais preciso sobre o que exatamente você não gosta nesse comportamento agora, por favor?

Olá Joffrey,

Obrigado por continuar a investigar isso. Com as alterações de código atuais (certifiquei-me de puxar o código mais recente, limpar tmp e reiniciar o servidor de desenvolvimento), ele não recuperou o comportamento que estava presente em versões anteriores à 2.8.0.beta5. Ele ainda não rola para mostrar a categoria atual no topo das opções visíveis no menu suspenso.

O comportamento correto/desejado é o que é mostrado no primeiro vídeo na postagem original, no entanto, atualmente ele ainda funciona como no segundo vídeo. Atualmente, a barra de rolagem sempre começa totalmente no topo, independentemente de onde a categoria atual está nas opções.

A linha rowContainer?.focus({ preventScroll }); parece não ter efeito neste caso, independentemente de preventScroll ser true, false, ou mesmo se a linha inteira for removida.

A linha essencial que faz o comportamento funcionar (não presente na versão atual) é:

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

Sem isso, ele não rola para a posição correta, já que scrollTop é 0 por padrão. Após a execução desta linha, scrollTop é igual ao número correto de pixels que ele precisa rolar para baixo.

Espero que isso seja útil. Por favor, me avise se eu puder ajudar a esclarecer mais.

Obrigado!

Sim, não está no topo, mas está na viewport, o que eu diria que é suficiente.

Olá Joffrey,

Obrigado pelo feedback. Adicionei mais categorias à minha demonstração e confirmei que a categoria atual agora aparece na visualização, definitivamente uma melhoria. Ainda seria ideal que ela aparecesse no topo da lista, como costumava acontecer. Isso garantiria que mais subcategorias abaixo dela ficassem imediatamente visíveis e o usuário pudesse clicar para mudar para uma subcategoria sem primeiro rolar para baixo para revelá-las. Na minha opinião, este é um caso de uso mais forte do que revelar categorias adjacentes não relacionadas. Foi alterado para ficar centralizado de propósito ou foi um regresso acidental do comportamento anterior? De qualquer forma, a decisão é sua - estou apenas oferecendo minha opinião.

Obrigado novamente e aprecio seu trabalho árduo no Discourse!