Filtro de pesquisa de grade Web Components

    O recurso Filtro de Pesquisa Ignite UI for Web Components no Web Components Grid permite o processo de localização de valores na coleta de dados. Facilitamos a configuração dessa funcionalidade e ela pode ser implementada com uma caixa de entrada de pesquisa, botões, navegação por teclado e outros recursos úteis para uma experiência de usuário ainda melhor. Embora os navegadores forneçam nativamente a funcionalidade de pesquisa de conteúdo, na maioria das vezes eles IgcGridComponent virtualizam suas colunas e linhas que estão fora de exibição. Nesses casos, a pesquisa nativa do navegador não consegue pesquisar dados nas células virtualizadas, pois elas não fazem parte do DOM. Estendemos a grade baseada em tabela do Web Components Material com uma API de pesquisa que permite pesquisar o conteúdo virtualizado do IgcGridComponent.

    Web Components Search Example

    O exemplo a seguir representa IgcGridComponent uma caixa de entrada de pesquisa que permite pesquisar em todas as colunas e linhas, bem como opções de filtragem específicas para cada coluna.

    Web Components Search Usage

    Grid Setup

    Vamos começar criando nossa grade e vinculando-a aos nossos dados. Também adicionaremos alguns estilos personalizados para os componentes que usaremos!

    .gridSize {
        --ig-size: var(--ig-size-small);
    }
    
    <igc-grid id="grid1" class="gridSize" auto-generate="false" allow-filtering="true">
        <igc-column field="IndustrySector" data-type="string" sortable="true"></igc-column>
        <igc-column field="IndustryGroup" data-type="string" sortable="true"></igc-column>
        <igc-column field="SectorType" data-type="string" sortable="true"></igc-column>
        <igc-column field="KRD" data-type="number" sortable="true"></igc-column>
        <igc-column field="MarketNotion" data-type="number" sortable="true"></igc-column>
        <igc-column field="Date" data-type="date" sortable="true"></igc-column>
    </igc-grid>
    

    Ótimo, e agora vamos nos preparar para a nossa IgcGridComponent API de pesquisa! Podemos criar algumas propriedades, que podem ser usadas para armazenar o texto pesquisado no momento e se a pesquisa diferencia maiúsculas de minúsculas e/ou por uma correspondência exata.

        private grid: IgcGridComponent;    
    
        private searchBox: IgcInputComponent;
        
        private searchIcon: IgcIconComponent;
        private clearIcon: IgcIconComponent;
        private nextIconButton: IgcIconButtonComponent;
        private prevIconButton: IgcIconButtonComponent;
    
        private caseSensitiveChip: IgcChipComponent;
        private exactMatchChip: IgcChipComponent;
    

    Web Components Search Box Input

    Agora vamos criar nossa entrada de pesquisa! Ao obter o elemento de entrada, podemos obter seu valor atual. Isso nos permitirá usar os IgcGridComponent métodos e findPrev para destacar todas as ocorrências findNext do SearchText e rolar para o próximo/anterior (dependendo de qual método invocamos).

    Ambos os métodos e findNext os findPrev métodos têm três argumentos:

    • Text: string (o texto que estamos procurando)
    • (opcional) CaseSensitive: boolean (a pesquisa deve diferenciar maiúsculas de minúsculas ou não, o valor padrão é false)
    • (opcional) ExactMatch: boolean (a busca deve ser por uma correspondência exata ou não, o valor padrão é false)

    Ao pesquisar por uma correspondência exata, a API de pesquisa destacará como resultados apenas os valores de células que correspondem inteiramente ao SearchText, levando em conta também a diferenciação entre maiúsculas e minúsculas. Por exemplo, as strings 'software' e 'Software' são uma correspondência exata, desconsiderando a diferenciação entre maiúsculas e minúsculas.

    Os métodos acima retornam um valor numérico (o número de vezes que contém IgcGridComponent a cadeia de caracteres fornecida).

    <igc-input id="searchBox" name="searchBox">
    </igc-input>
    
    constructor() {
        var grid = this.grid = document.getElementById('grid') as IgcGridComponent;
        this.searchBox = document.getElementById('searchBox') as IgcInputComponent;
        grid.data = new MarketData();
    }
    
    public nextSearch(){
        this.grid.findNext(this.searchBox.value, false, false);
    }
    

    Add Search Buttons

    Para pesquisar e navegar livremente entre nossos resultados de pesquisa, vamos criar alguns botões invocando o findNext e os findPrev métodos dentro dos respectivos manipuladores de eventos de clique dos botões.

    <igc-icon-button id="prevIconBtn" variant="flat" name="prev" collection="material" ></igc-icon-button>
    <igc-icon-button id="nextIconBtn" variant="flat" name="next" collection="material"></igc-icon-button>
    
    constructor() {
        var nextIconButton = document.getElementById('nextIconBtn') as IgcIconButtonComponent;
        var prevIconButton = document.getElementById('prevIconBtn') as IgcIconButtonComponent;
        nextIconButton.addEventListener("click", this.nextSearch);
        prevIconButton.addEventListener("click", this.prevSearch);
    }
    public prevSearch() {
        this.grid.findPrev(this.searchBox.value, this.caseSensitiveChip.selected, this.exactMatchChip.selected);
    }
    
    public nextSearch() {
        this.grid.findNext(this.searchBox.value, this.caseSensitiveChip.selected, this.exactMatchChip.selected);
    }
    

    Também podemos permitir que os usuários naveguem pelos resultados usando as teclas de seta do teclado e a Enter tecla. Para conseguir isso, podemos lidar com o evento keydown de nossa entrada de pesquisa, impedindo o movimento de acento circunflexo padrão da entrada com o PreventDefault método e invocar os findNext métodos / findPrev, dependendo de qual tecla o usuário pressionou.

    <input id="searchBox" name="searchBox"/>
    
    constructor() {
         searchBox.addEventListener("keydown", (evt) => { this.onSearchKeydown(evt); });
         this.searchBox.addEventListener("igcInput", (evt) => {
            this.searchIcon.name = evt.detail ? 'clear' : 'search';
            this.grid.findNext(evt.detail, this.caseSensitiveChip.selected, this.exactMatchChip.selected);
         });
    }
    
    public onSearchKeydown(evt: KeyboardEvent) {  
            if (evt.key === 'Enter' || evt.key === 'ArrowDown') {
                evt.preventDefault();
                this.grid.findNext(this.searchBox.value, this.caseSensitiveChip.selected, this.exactMatchChip.selected);
            } else if (evt.key === 'ArrowUp') {
                evt.preventDefault();
                this.grid.findPrev(this.searchBox.value, this.caseSensitiveChip.selected, this.exactMatchChip.selected);
            }
        }
    }
    

    Case Sensitive and Exact Match

    Agora vamos permitir que o usuário escolha se a pesquisa deve diferenciar maiúsculas de minúsculas e/ou por uma correspondência exata. Para isso, podemos usar entradas simples de caixa de seleção e vincular ao seu change evento onde podemos usar o estado da caixa checked de seleção.

    <span>Case sensitive</span>
    <input id="case" type="checkbox">
    
    <span>Exact match</span>
    <input id="exact" type="checkbox">
    
    constructor() {
        const case = document.getElementById("case") as HTMLInputElement;
        const exact = document.getElementById("exact") as HTMLInputElement;
        case.addEventListener("change", this.updateSearch);
        exact.addEventListener("change", this.updateSearch);
    }
    
    public updateSearch() {
        const search1 = document.getElementById("search1") as HTMLInputElement;
        const case = document.getElementById("case") as HTMLInputElement;
        const exact = document.getElementById("exact") as HTMLInputElement;
        const grid = document.getElementById("grid") as IgcGridComponent;
        grid.findNext(search1.value, case.checked, exact.checked);
    }
    

    Persistence

    E se quisermos filtrar e classificar nosso IgcGridComponent ou mesmo para adicionar e remover registros? Após essas operações, os destaques de nossa pesquisa atual são atualizados automaticamente e persistem sobre qualquer texto que corresponda ao SearchText! Além disso, a pesquisa funcionará com paginação e persistirá os destaques por meio de alterações do IgcGridComponent 's PerPage propriedade.

    Adding icons

    Ao usar alguns dos nossos outros componentes, podemos criar uma interface de usuário enriquecida e melhorar o design geral de toda a nossa barra de pesquisa! Podemos ter um belo ícone de pesquisa ou exclusão à esquerda da entrada de pesquisa, alguns chips para nossas opções de pesquisa e alguns ícones de material design combinados com belos botões em estilo ripple para nossa navegação à direita. Podemos envolver esses componentes dentro de um grupo de entrada para um design mais refinado.

    import { defineComponents, IgcInputComponent, IgcChipComponent, IgcIconComponent, IgcIconButtonComponent, registerIconFromText } from "igniteui-webcomponents";
    
    defineComponents(IgcInputComponent, IgcChipComponent, IgcIconComponent, IgcIconButtonComponent);
    

    Por fim, vamos atualizar nosso modelo com os novos componentes!

    <igc-input id="searchBox" name="searchBox">
        <igc-icon id="searchIcon" slot="prefix" name="search" collection="material"></igc-icon>
        <div slot="suffix">
            <igc-chip selectable="true" id="caseSensitiveChip">Case Sensitive</igc-chip>
            <igc-chip selectable="true" id="exactMatchChip">Exact Match</igc-chip>
        </div>
        <div slot="suffix">
            <igc-icon-button id="prevIconBtn" variant="flat" name="prev" collection="material" ></igc-icon-button>
            <igc-icon-button id="nextIconBtn" variant="flat" name="next" collection="material"></igc-icon-button>
        </div>
    </igc-input>
    
    constructor() {
        const prevIconText = "<svg width='24' height='24' viewBox='0 0 24 24'><path d='M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z'></path></svg>";
        const nextIconText = "<svg width='24' height='24' viewBox='0 0 24 24'><path d='M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z'></path></svg>";
        const clearIconText = "<svg width='24' height='24' viewBox='0 0 24 24' title='Clear'><path d='M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z'></path></svg>";
        const searchIconText = "<svg width='24' height='24' viewBox='0 0 24 24'><path d='M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z' /></svg>";
    
        registerIconFromText("prev", prevIconText, "material");
        registerIconFromText("next", nextIconText, "material");
        registerIconFromText("clear", clearIconText, "material");
        registerIconFromText("search", searchIconText, "material");
    }
    

    À direita, em nosso grupo de entrada, vamos criar três contêineres separados com as seguintes finalidades:

    • Para exibir alguns chips que alternam as propriedades CaseSensitive e ExactMatch. Substituímos as caixas de seleção por dois chips estilosos que mudam de cor com base nessas propriedades. Sempre que um chip é clicado, invocamos seu respectivo manipulador.
    <div slot="suffix">
        <igc-chip selectable="true" id="caseSensitiveChip">Case Sensitive</igc-chip>
        <igc-chip selectable="true" id="exactMatchChip">Exact Match</igc-chip>
    </div>
    
    constructor() {
        const input = document.getElementById("searchBox") as IgcInputComponent;
        input.addEventListener("change", this.updateSearch);
    }
    public updateSearch() {
        const grid = document.getElementById('grid') as IgcGridComponent;
        const caseSensitiveChip = document.getElementById('caseSensitiveChip') as IgcChipComponent;
        const exactMatchChip = document.getElementById('exactMatchChip') as IgcChipComponent;
        grid.findNext(input.value, caseSensitiveChip.selected, exactMatchChip.selected);
    }
    
    • Para os botões de navegação de pesquisa, transformamos nossas entradas em botões de estilo ondulado com ícones de materiais. Os manipuladores para os eventos de clique permanecem os mesmos - invocando os métodos / findNext​ ​findPrev.
    <div slot="suffix">
        <igc-icon-button id="prevIconBtn" variant="flat" name="prev" collection="material" ></igc-icon-button>
        <igc-icon-button id="nextIconBtn" variant="flat" name="next" collection="material"></igc-icon-button>
    </div>
    
    constructor() {
        const nextIconButton = this.nextIconButton = document.getElementById('nextIconBtn') as IgcIconButtonComponent;
        const prevIconButton = this.prevIconButton = document.getElementById('prevIconBtn') as IgcIconButtonComponent;
        nextIconButton.addEventListener("click", this.nextSearch);
        prevIconButton.addEventListener("click", this.prevSearch);
    }
    
    public nextSearch() {
        this.grid.findNext(this.searchBox.value, this.caseSensitiveChip.selected, this.exactMatchChip.selected);
    }
    
    public prevSearch() {
        this.grid.findPrev(this.searchBox.value, this.caseSensitiveChip.selected, this.exactMatchChip.selected);
    }
    

    Known Limitations

    Limitação Descrição
    Pesquisando em células com um modelo Os destaques da funcionalidade de pesquisa funcionam apenas para os modelos de célula padrão. Se você tiver uma coluna com modelo de célula personalizado, os destaques não funcionarão, então você deve usar abordagens alternativas, como um formatador de coluna, ou definir osearchable propriedade na coluna como falsa.
    Virtualização Remota A pesquisa não funcionará corretamente ao usar virtualização remota
    Células com texto cortado Quando o texto na célula é muito grande para caber e o texto que estamos procurando é cortado pelas reticências, ainda rolaremos até a célula e a incluiremos na contagem de correspondências, mas nada será destacado

    API References

    Neste artigo, implementamos nossa própria barra de pesquisa para o IgcGridComponent com algumas funcionalidades adicionais quando se trata de navegar entre os resultados da pesquisa. Também usamos alguns componentes Ignite UI for Web Components adicionais, como ícones, chips e entradas. A API de pesquisa está listada abaixo.

    IgcGridComponent methods:

    IgcColumnComponent properties:

    Componentes adicionais com APIs relativas que foram usadas:

    Additional Resources

    Nossa comunidade é ativa e sempre acolhedora para novas ideias.