Skip to content

fix: corrige quebra de busca quando nenhuma opção é encontrada#1065

Merged
ezequias21 merged 5 commits intomainfrom
bugfix/select-search-empty-local-options
Mar 11, 2026
Merged

fix: corrige quebra de busca quando nenhuma opção é encontrada#1065
ezequias21 merged 5 commits intomainfrom
bugfix/select-search-empty-local-options

Conversation

@jvictordev1
Copy link
Contributor

@jvictordev1 jvictordev1 commented Mar 9, 2026

Por favor, verifique se o seu pull request está de acordo com o checklist abaixo:

  • A implementação feita possui testes (Caso haja um motivo para não haver testes/haver apenas testes de snapshot, descrever abaixo)
  • A documentação no mdx foi feita ou atualizada, caso necessário
  • O eslint passou localmente

1 - Resumo

Corrige erro no select quando a busca no mesmo não corresponde a nenhum item e o botão Enter é pressionado.

2 - Tipo de pull request

  • 🧱 Novo componente
  • ✨ Nova feature ou melhoria
  • 🐛 Fix
  • 👨‍💻 Refatoração
  • 📝 Documentação
  • 🎨 Estilo
  • 🤖 Build ou CI/CD

3 - Esse PR fecha alguma issue? Favor referenciá-la

Não.

4 - Quais são os passos para avaliar o pull request?

  • Busque por algum item que não existe nas opções do select e, ao pressionar enter, verifique que não há erro no console e o select volta a seu estado inicial (sem item selecionado)
  • Verifique que os testes passam
  • Altere as props e veja que o select continua funcionando

5 - Imagem ou exemplo de uso:

image

6 - Esse pull request adiciona breaking changes?

  • Sim
  • Não

@github-actions github-actions bot added the 🐛 Bug Algo não está funcionando label Mar 9, 2026
@jvictordev1 jvictordev1 marked this pull request as ready for review March 10, 2026 16:44
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Mar 10, 2026

Greptile Summary

Este PR corrige uma quebra no componente Select.vue que ocorria quando nenhuma opção era encontrada durante a busca — situação em que localOptions ficava vazio e operações subsequentes (como pressionar Enter ou selecionar um item) podiam lançar erros ou deixar o estado interno inconsistente.

Principais mudanças:

  • Adicionados os refs isTyping e internalInputValue para separar o estado do input durante digitação do valor efetivamente selecionado, convertendo computedModel em um computed com getter/setter.
  • Adicionada proteção em activateSelectionOnEnter para evitar cloneDeep de undefined quando localOptions está vazio, retornando {} nesse caso.
  • watch(localValue) atualizado para usar JSON.stringify na comparação (deep equality) e para tratar corretamente o caso de localValue vazio, emitindo '' ou {} conforme a prop returnValue.
  • Retorno antecipado em filterOptions quando o valor digitado coincide com o valor já selecionado, evitando re-filtragem desnecessária.
  • Limpeza explícita de isTyping e active adicionada em selectItem e hide.
  • Sem novos testes: apesar do checklist indicar que foram adicionados testes, o diff não inclui novos casos de teste cobrindo especificamente o cenário corrigido (busca sem resultados). Os testes existentes são predominantemente de snapshot/renderização.

Confidence Score: 4/5

  • Este PR é seguro para merge com risco baixo — corrige um bug real com lógica bem estruturada e mudanças de escopo limitado.
  • A abordagem com isTyping + internalInputValue é sólida e resolve o problema reportado. O uso de active.value = !active.value em selectItem é uma pequena inconsistência de estilo (deveria ser active.value = false) mas dificilmente causará um bug em produção dado o fluxo normal de uso. A ausência de testes novos para o cenário corrigido é o ponto que mais reduz a confiança.
  • Atenção especial para src/components/Select.vue — verificar o comportamento de selectItem com o toggle de active e o retorno antecipado de filterOptions para entradas diretas (colar/autocompletar).

Important Files Changed

Filename Overview
src/components/Select.vue Correção da quebra de busca quando nenhuma opção é encontrada: adicionados isTyping e internalInputValue para controle do estado do input, computedModel convertido para computed com getter/setter, proteção contra crash no activateSelectionOnEnter com lista vazia, retorno antecipado em filterOptions para evitar re-filtragem redundante, e limpeza explícita de estado (isTyping, active) em selectItem e hide. Pequena inconsistência: uso de !active.value (toggle) em vez de active.value = false em selectItem.
package.json Bump de versão de 3.154.8 para 3.154.9 (patch), refletindo o fix realizado no componente Select.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A([Usuário digita]) --> B[computedModel setter\nisTyping = true\ninternalInputValue = val]
    B --> C[filterOptions chamado]
    C --> D{val igual ao\nvalor selecionado?}
    D -- Sim --> E[Retorno antecipado\nlocalOptions inalterado]
    D -- Não --> F[Filtra localOptions]

    G([Enter pressionado]) --> H{localOptions\nvazio?}
    H -- Sim --> I[localValue = vazio\nisTyping = false]
    H -- Não --> J[localValue = primeira opção\nisTyping = false]

    K([Clique em item]) --> L[selectItem\nlocalValue = item\nactive = false\nisTyping = false\nblur]
    L --> M[hide via blur\nreset localOptions\nactive = false\nisTyping = false]

    N([Blur no input]) --> O[hide\nverifica localValue\nreset estado]
Loading

Last reviewed commit: afdeadc

@ezequias21
Copy link
Contributor

Ao buscar por novo um item não existente no select e apertar Enter,

image

ele seleciona o último item selecionado:

image

@ezequias21 ezequias21 merged commit e2f56c1 into main Mar 11, 2026
8 checks passed
@ezequias21 ezequias21 deleted the bugfix/select-search-empty-local-options branch March 11, 2026 14:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐛 Bug Algo não está funcionando

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants