Adicione um componente combobox à biblioteca.
Estamos lidando com muitos dados. Nosso dt-select realmente não funciona com um grande conjunto de opções. A funcionalidade de pesquisa para o dt-select é a mesma que no select nativo. Portanto, um usuário só pode pular para uma opção que comece com a tecla que o usuário pressionou.
Isso é realmente limitante em casos de uso com grandes conjuntos de dados.
Um componente combobox que pode ser construído a partir de uma entrada com um dt-autocomplete anexado pode nos ajudar nisso.
A entrada precisa mostrar um texto de espaço reservado.
A combobox deve usar os mesmos estilos que o dt-select.
Ao clicar, o menu suspenso abre uma lista de vários itens para o usuário escolher e o cursor é colocado no campo de entrada. Assim que os usuários começarem a digitar, a combobox deve emitir um evento debelado e mostrar um indicador de carregamento dentro da entrada semelhante ao que já temos no campo de filtro.
Depois que um item é selecionado, a lista suspensa fecha e o campo de entrada é atualizado de acordo.
Para a primeira versão do combobox, sugiro não se preocupar com a rolagem virtual. Podemos esperar que a filtragem dos itens seja feita no lado do servidor. Os itens preenchidos no cliente podem ser renderizados. Podemos melhorar o manuseio de grandes conjuntos de dados em uma segunda versão.
Para a primeira versão, eu sugeriria usar o dt-autocomplete, mas devemos considerar a criação de um menu suspenso simplificado com um datalist.
Como uma referência de acessibilidade, por favor, considere a recomendação de prática recomendada da caixa de combinação WAI-ARIA com pop-up da caixa de listagem
Caixa de combinação de propostas de API
Estrutura avançada
<dt-combobox [value]="initialValue" (valueChanges)="fn($event)" (filterChanges)="fn($event)" [placeholder]="'Type here for filter'">
<dt-option *ngFor="let option of options">{{ option.value }} </dt-option>
</dt-combobox>
Entradas
| Nome Tipo | Descrição
| ------------- | ------------- | ------------- |
| value
| string \| undefined
| Valor inicial da entrada |
| placeholder
| string \| undefined
| Espaço reservado para a entrada |
Saídas
| Nome Tipo | Descrição
| ------------- | ------------- | ------------- |
| valueChanges
| EventEmitter<string>
| Evento emitido quando um novo valor foi selecionado |
| filterChanges
| EventEmitter<string>
| Evento emitido quando o filtro muda |
Projeção de conteúdo
opção dt
dt-optgroup
Lista de controle
Olá @ lukett89 , obrigado pela proposta de API. Excelente ponto de partida.
Acho que precisaríamos das mesmas entradas de dt-select
.
Eu adicionaria
| Nome Tipo | Descrição
| ------------- | ------------- | ------------- |
| id
| string
| Id para selecionar |
| compareWith
| (v1: T, v2: T) => boolean
| Função para comparar os valores das opções com os valores selecionados |
| required
| boolean
| Se a entrada é necessária |
| panelClass
| string
| Classe adicionada ao menu suspenso combobox |
Devemos considerar também a adição de getters para o estado aberto como "aberto" e saídas quando esse estado for alterado.
Acho que seria benéfico se pudéssemos nos ater à API mais próxima possível da seleção para tornar a alternância entre um ou outro o mais fácil possível.
Obrigado pela sua resposta @ ffriedl89.
Levaremos em consideração todas as entradas / saídas que você mencionou para a primeira versão do componente.
Combobox de proposta final de API
Estrutura avançada
<dt-combobox [value]="initialValue" (valueChanges)="fn($event)" (filterChanges)="fn($event)" [placeholder]="'Type here for filter'">
<dt-option *ngFor="let option of options">{{ option.value }} </dt-option>
</dt-combobox>
Entradas
| Nome Tipo | Descrição
| ------------- | ------------- | ------------- |
| value
| string \| undefined
| Valor inicial da entrada |
| placeholder
| string \| undefined
| Espaço reservado para a entrada |
| id
| string | Id para selecionar |
| compareWith
| (v1: T, v2: T) => boolean
| Função para comparar os valores das opções com os valores selecionados |
| required
| boolean
| Se a entrada é necessária |
| panelClass
| string
| Classe adicionada ao menu suspenso combobox |
Saídas
| Nome Tipo | Descrição
| ------------- | ------------- | ------------- |
| valueChanges
| EventEmitter<string>
| Evento emitido quando um novo valor foi selecionado |
| filterChanges
| EventEmitter<string>
| Evento emitido quando o filtro muda |
| openedChange
| EventEmitter
Projeção de conteúdo
opção dt
dt-optgroup
Lista de controle
Eu gostaria de cuidar da implementação desse recurso nas próximas 2 semanas. Você poderia atribuir o problema para mim, por favor?
Em sincronia e após discussão com @heartdisease e @ lukett89 , reatribuí o problema.
Proponho a adição de mais duas entradas:
| Nome Tipo | Valor padrão | Descrição
| --- | --- | --- | --- |
| carregando | boolean
| false
| Quando definido como verdadeiro, um indicador de carregamento é mostrado para mostrar ao usuário que os dados estão sendo carregados / filtrados |
| displayWith | (value: T) => string
| (value: T) =>
$ {value} `` | Uma função que retorna um nome de exibição para um determinado objeto que representa uma opção da combobox |
A função displayWith é relevante para usar a combobox com objetos e um indicador de carregamento parece garantido para um componente que - na maioria dos casos - irá descarregar a filtragem para o lado do servidor.
Comentários muito úteis
Proponho a adição de mais duas entradas:
| Nome Tipo | Valor padrão | Descrição
| --- | --- | --- | --- |
| carregando |
boolean
|false
| Quando definido como verdadeiro, um indicador de carregamento é mostrado para mostrar ao usuário que os dados estão sendo carregados / filtrados || displayWith |
(value: T) => string
|(value: T) =>
$ {value} `` | Uma função que retorna um nome de exibição para um determinado objeto que representa uma opção da combobox |A função displayWith é relevante para usar a combobox com objetos e um indicador de carregamento parece garantido para um componente que - na maioria dos casos - irá descarregar a filtragem para o lado do servidor.