VxAutoSuggest

src/components/vx-auto-suggest/VxAutoSuggest.vue
Form Medium 1 uso

Campo de busca com dropdown de sugestões agrupadas. Suporta múltiplos grupos de resultados, navegação por teclado (↑↓ Enter Esc), seleção por mouse, limite de resultados e slots dinâmicos por grupo para renderização customizada de cada item. Utilizado exclusivamente no Bookmarks da navbar.

Typos no código fonte: initalData (não initialData) e inputClassses (3 s's). Usar exatamente como documentado. @selected retorna { [groupName]: suggestion }, não o item diretamente.

Busca com Auto-Foco

Uso padrão na navbar — autoFocus=true foca o input ao montar. hideGroupTitle oculta o cabeçalho de grupo. Slot dinâmico v-slot:pages renderiza cada item com ícone Feather + título + estrela de bookmark.

Fechado
Aberto com resultados
Pedidos
Pedfarma Clientes
Pedidos ERP
Real Bookmarks.vue:34

Com Dados Iniciais (initalData)

initalData (typo intencional — sem segundo 'i') define itens exibidos quando o input está vazio, como starred pages. Mesmo formato do prop data: { groupName: [...] }.

Bookmarks
Dashboard
Atendimentos
Pedidos
Real Bookmarks.vue:34

Multi-grupo com Header Customizado

Múltiplos grupos no prop data. Slot group personaliza o cabeçalho de cada seção. Um slot dinâmico por grupo. Sem uso real — o admin usa apenas um grupo (pages).

PEDIDOS
#PED-001234 — Confirmado
#PED-001198 — Pendente
CLIENTES
João Pedreira Santos
Sintético synthetic

Sem Resultados (slot noResult)

Slot noResult personaliza a mensagem quando o grupo não retorna resultados. Recebe group_name para mensagens contextuais.

clientes
Nenhum clientes encontrado.
Sintético synthetic

API

<!-- data: { groupName: { key: 'fieldToSearch', data: [...] } } — estrutura obrigatória -->
<!-- Slot dinâmico: nome = chave do grupo. Recebe 'suggestion' (o objeto do item) -->
<vx-auto-suggest
  :data="{ pages: { key: 'title', data: pagesList } }"
  :initalData="{ pages: starredPages }"
  :searchLimit="5"
  :autoFocus="true"
  :hideGroupTitle="false"
  placeholder="Buscar..."
  inputClassses="w-full"
  @input="onQueryChange"
  @selected="onSelect"
  @closeSearchbar="onClose"
>
  <template v-slot:pages="{ suggestion }">
    <span>{{ suggestion.title }}</span>
  </template>
</vx-auto-suggest>

Props

NomeTipoDefaultObrig.Descrição
dataObjectSimDados para busca. { groupName: { key: 'campo', data: [...] } }. Cada grupo gera uma seção e requer slot com o mesmo nome.
placeholderString"Search.."Placeholder do input.
initalDataObject{}Dados exibidos com input vazio (starred/pinned). Typo intencional: initalData (sem segundo 'i').
inputClasssesString|Object|ArraynullClasses CSS extras para o vs-input. Typo intencional: inputClassses (3 s's).
autoFocusBooleanfalseFoca o input ao montar. Quando muda para false, limpa o query.
searchLimitNumber4Máximo de sugestões por grupo. Resultados startsWith aparecem antes dos indexOf.
hideGroupTitleBooleanfalseOculta o cabeçalho de grupo. Útil com um único grupo.
showPinnedBooleanfalseDeclarada mas sem implementação — reservada para uso futuro.

Slots

NomeScopeDescrição
group{ group_name }Header de cada grupo (quando hideGroupTitle=false).
[groupName]{ suggestion }Slot dinâmico — nome = chave do grupo no data. Renderiza cada item. Obrigatório por grupo.
noResult{ group_name }Exibido quando grupo sem resultados. Default: "No Results Found."

Eventos

NomePayloadDescrição
inputStringA cada caractere digitado — valor atual do query.
selected{ [groupName]: suggestion }Ao selecionar um item (click ou Enter). Payload: objeto com a chave do grupo e o item selecionado.
closeSearchbarAo pressionar Esc — pai deve fechar/ocultar o componente.

Navegação por teclado

TeclaAção
Próximo item (atravessa grupos)
Item anterior (atravessa grupos)
EnterSeleciona o item atual e fecha dropdown
EscLimpa query e emite closeSearchbar

Onde é usado

  • src/layouts/components/navbar/components/Bookmarks.vue