kodda

EntityCombobox

Combobox genérico com busca assíncrona para entidades.

Carregando...

Instalação

npx @koddaai/ui add entity-combobox

Dependências shadcn/ui: popover, command, button

Importação

import { EntityCombobox } from "@/components/kodda/entity-combobox"

Características

  • Busca assíncrona com debounce de 300ms
  • Ícone ChevronsUpDown no botão trigger
  • Ícone Check indicando o item selecionado
  • Spinner Loader2 animado durante carregamento
  • Placeholder com text-muted-foreground quando sem valor
  • Largura do popover acompanha o trigger via CSS variable
  • Renderização customizável de itens e item selecionado

Props

PropTipoDefaultDescrição
valuestringValor selecionado
onChange(value: string, entity?: T) => voidCallback com valor e entidade
onSearch(query: string) => Promise<T[]>Busca async (debounce 300ms)
renderItem(item: T) => ReactNodeRenderização de cada item
renderSelected(item: T) => ReactNodeRenderização do item selecionado
getItemValue(item: T) => stringExtrai valor do item
getItemLabel(item: T) => stringExtrai label do item
placeholderstring"Selecionar..."Placeholder
searchPlaceholderstring"Buscar..."Placeholder da busca
emptyMessagestring"Nenhum resultado encontrado."Mensagem vazio
disabledbooleanDesabilitado
classNamestringClasses adicionais

Uso

const [customerId, setCustomerId] = useState("")

<EntityCombobox<Customer>
  value={customerId}
  onChange={(value, customer) => setCustomerId(value)}
  onSearch={async (query) => {
    const res = await api.customers.search({ query })
    return res.data
  }}
  renderItem={(c) => (
    <div className="flex flex-col">
      <span className="font-medium">{c.name}</span>
      <span className="text-xs text-muted-foreground">{c.document}</span>
    </div>
  )}
  renderSelected={(c) => c.name}
  getItemValue={(c) => c.id}
  getItemLabel={(c) => c.name}
  placeholder="Selecionar cliente..."
  searchPlaceholder="Buscar por nome ou documento..."
  emptyMessage="Nenhum cliente encontrado."
/>

On this page