Ocultación de columnas en cuadrícula Angular

    La cuadrícula Ignite UI for Angular proporciona un IgxColumnActionsComponent​ ​IgxColumnHidingDirective que permite a los usuarios realizar la ocultación de columnas directamente a través de la interfaz de usuario o mediante el uso del componente Angular. La cuadrícula de la interfaz de usuario de material tiene una interfaz de usuario de ocultación de columnas incorporada, que se puede usar a través de la barra de herramientas de la cuadrícula para cambiar el estado visible de las columnas. Además, los desarrolladores siempre pueden definir la interfaz de usuario que oculta la columna como un componente independiente y colocarla en cualquier lugar de la página que deseen.

    Ejemplo de ocultación de columnas en cuadrícula Angular

    EXAMPLE
    TS
    HTML
    SCSS

    ¿Te gusta esta muestra? Obtenga acceso a nuestro kit de herramientas de Ignite UI for Angular completo y comience a crear sus propias aplicaciones en minutos. Descárgalo gratis.

    Configuración de cuadrícula

    Comencemos creando nuestra Grid y vinculándola a nuestros datos. También habilitaremos el filtrado y la clasificación de las columnas.

    <!--columnHiding.component.html-->
    
    <igx-grid #grid id="grid" [data]="data" [autoGenerate]="false" width="100%" height="560px" columnWidth="200px" [allowFiltering]="true">
        <igx-column [field]="'ID'" dataType="string" [sortable]="true" [hidden]="true"></igx-column>
        <igx-column [field]="'ContactName'" dataType="string" [sortable]="true" [hidden]="true"></igx-column>
        <igx-column [field]="'ContactTitle'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'City'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'CompanyName'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'Fax'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'Address'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'PostalCode'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'Country'" dataType="string" [sortable]="true"></igx-column>
        <igx-column [field]="'Phone'" dataType="string" [sortable]="true"></igx-column>
    </igx-grid>
    html

    IU para ocultar columnas de la barra de herramientas

    La interfaz de usuario integrada para ocultar columnas se coloca dentro de un IgxDropDownComponent en la barra de herramientas de Grid. Podemos mostrar/ocultar la interfaz de usuario de ocultación de columnas usando este menú desplegable exacto. Para ello, todo lo que tenemos que hacer es configurar tanto IgxGridToolbarActionsComponent como IgxGridToolbarHidingComponent dentro del Grid. También agregaremos un título a nuestra barra de herramientas usando IgxGridToolbarTitleComponent y un estilo personalizado para el contenedor de nuestra Grid.

    <!--columnHiding.component.html-->
    
    <div class="grid__wrapper">
        <igx-grid ...>
            <igx-grid-toolbar>
                <igx-grid-toolbar-title>Employees</igx-grid-toolbar-title>
                <igx-grid-toolbar-actions>
                    <igx-grid-toolbar-hiding></igx-grid-toolbar-hiding>
                </igx-grid-toolbar-actions>
            </igx-grid-toolbar>
            ...
        </igx-grid>
    </div>
    html
    /* columnHiding.component.css */
    
    .grid__wrapper {
        margin: 10px;
    }
    css

    Grid nos proporciona algunas propiedades útiles cuando se trata de usar la interfaz de usuario para ocultar columnas de la barra de herramientas. Al utilizar el igx-grid-toolbar-hiding ​ ​title propiedad, estableceremos el título que se muestra dentro del botón desplegable en la barra de herramientas.

    <!--columnHiding.component.html-->
    
    <div class="grid__wrapper">
        <igx-grid>
            <igx-grid-toolbar>
                <igx-grid-toolbar-title>Employees</igx-grid-toolbar-title>
                <igx-grid-toolbar-actions>
                    <igx-grid-toolbar-hiding #hidingActionRef title="Column Hiding"></igx-grid-toolbar-hiding>
                </igx-grid-toolbar-actions>
            </igx-grid-toolbar>
        </igx-grid>
    </div>
    html

    Al utilizar la propiedad columnsAreaMaxHeight de IgxGridToolbarHidingComponent, podemos establecer la altura máxima del área que contiene las acciones de la columna. De esta forma si tenemos muchas acciones y no caben todas en el contenedor, aparecerá una barra de desplazamiento, que nos permitirá desplazarnos a cualquier acción que queramos.

    // columnHiding.component.ts
    
    public ngAfterViewInit() {        
        this.hidingActionRef.columnsAreaMaxHeight = "200px";
    }
    typescript

    Para utilizar el conjunto ampliado de funcionalidades para la interfaz de usuario que oculta columnas, podemos utilizar la propiedad columnsAreaMaxHeight de IgxColumnActionsComponent. De esta manera podremos utilizarlo según los requisitos de nuestra aplicación.

    Puedes ver el resultado del código anterior al comienzo de este artículo en la sección Ejemplo de ocultación de columnas Angular.

    Interfaz de usuario personalizada para ocultar columnas

    Digamos que queremos definir manualmente nuestro IgxColumnActionsComponent, agregar IgxColumnHidingDirective para que sepa cuál sería su propósito y colocarlo en cualquier lugar de la página. Sin embargo, primero debemos importar IgxColumnActionsModule.

    // app.module.ts
    
    ...
    import {
        ...
        IgxColumnActionsModule 
    } from 'igniteui-angular';
    // import { ..., IgxColumnActionsModule } from '@infragistics/igniteui-angular'; for licensed package
    
    @NgModule({
        ...
        imports: [..., IgxColumnActionsModule],
    })
    export class AppModule {}
    typescript

    Ahora creemos nuestro IgxColumnActionsComponent. En nuestra aplicación, lo colocaremos al lado de la cuadrícula (lo cual no es el caso con la columna de la barra de herramientas que oculta la interfaz de usuario, donde el componente está dentro de un menú desplegable por diseño). ¡También estableceremos la propiedad de columns del componente en las columnas de nuestro Grid e incluiremos algunos estilos personalizados para que nuestra aplicación se vea aún mejor!

    <!--columnHiding.component.html-->
    
    <div class="columnHidingContainer">
        <igx-column-actions igxColumnHiding #columnHidingUI [columns]="grid.columns">
        </igx-column-actions>
    </div>
    <div class="gridContainer">
        <igx-grid #grid [data]="data" [autoGenerate]="false" width="100%" height="500px" columnWidth="200px">
            ...
        </igx-grid>
    </div>
    html
    /* columnHiding.component.css */
    
    .grid__wrapper {
        margin: 15px;
        display: flex;
        flex-direction: row;
    }
    
    .columnHidingContainer {
        min-width: 250px;
        height: 560px;
        display: flex;
        flex-direction: column;
        padding-left: 20px;
        padding-right: 20px;
        border: 1px gray;
        border-radius: 10px;
        box-shadow: 1px 1px 2px 2px rgba(50, 50, 50, 0.25);
        igx-column-actions {
            height: 460px;
        }
    }
    
    .columnsOrderOptionsContainer {
        margin-top: 20px;
        margin-bottom: 20px;
    }
    
    .gridContainer {
        width: 100%;
        min-width: 200px;
        display: flex;
        flex-direction: column;
        margin-left: 30px;    
    }
    css

    Agregar título y mensaje de filtro

    Un par de cosas más que podemos hacer para enriquecer la experiencia del usuario de nuestro componente de ocultación de columnas es establecer el title y las propiedades filterColumnsPrompt. El title se muestra en la parte superior y filterColumnsPrompt es el texto del mensaje que se muestra en la entrada de filtro de nuestra interfaz de usuario que oculta columnas.

    <!--columnHiding.component.html-->
    
    <div class="columnHidingContainer">
        <igx-column-actions igxColumnHiding #columnHidingUI [columns]="grid.columns"
                           title="Column Hiding" filterColumnsPrompt="Type here to search">
        </igx-column-actions>
    </div>
    html

    Agregar opciones de orden de visualización de columnas

    También podemos permitir que el usuario elija el orden de visualización de las columnas en la interfaz de usuario que oculta columnas. Para ello usaremos la propiedad columnDisplayOrder, que es una propiedad de tipo enumeración y tiene las siguientes opciones:

    • Alfabético (ordenar las columnas alfabéticamente)
    • DisplayOrder (ordena las columnas según la forma en que se muestran en el Grid)

    ¡Creemos un par de botones de opción bien diseñados para nuestras opciones! Sólo tenemos que seguir adelante y conseguir el módulo IgxRadio.

    // app.module.ts
    
    ...
    import {
        ...
        IgxRadioModule    
    } from 'igniteui-angular';
    // import { ..., IgxRadioModule } from '@infragistics/igniteui-angular'; for licensed package
    
    @NgModule({
        ...
        imports: [..., IgxRadioModule],    
    })
    export class AppModule {}
    typescript

    Ahora todo lo que tenemos que hacer es vincular la propiedad checked de ambos botones de opción respectivamente con diferentes condiciones y manejar sus eventos de clic.

    <!--columnHiding.component.html-->
    
    <div class="columnHidingContainer">
        ...
        <div class="columnsOrderOptionsContainer">
            <igx-radio [checked]="columnHidingUI.columnDisplayOrder === 'Alphabetical'"
                       (click)="columnHidingUI.columnDisplayOrder = 'Alphabetical'">
                Alphabetical order
            </igx-radio>
            <igx-radio [checked]="columnHidingUI.columnDisplayOrder === 'DisplayOrder'"
                       (click)="columnHidingUI.columnDisplayOrder = 'DisplayOrder'">
                Display order
            </igx-radio>
        </div>
    </div>
    html

    Deshabilitar la ocultación de una columna

    Podemos evitar fácilmente que el usuario pueda ocultar columnas a través de la interfaz de usuario que oculta columnas simplemente configurando su propiedad disableHiding en verdadero.

    <!--columnHiding.component.html-->
    
    <div class="gridContainer">
        <igx-grid ... >
            ...
            <igx-column [field]="'ContactName'" dataType="string" [sortable]="true" [disableHiding]="true"></igx-column>
            <igx-column [field]="'ContactTitle'" dataType="string" [sortable]="true" [disableHiding]="true"></igx-column>
            ...
        </igx-grid>
    </div>
    html

    Si todo salió bien, así es como debería verse nuestro componente de interfaz de usuario para ocultar columnas:

    EXAMPLE
    TS
    HTML
    SCSS

    App Builder | CTA Banner

    Estilo

    Para comenzar a diseñar el componente de acciones de columna, necesitamos importar el archivo de índice, donde se encuentran todas las funciones del tema y los mixins de componentes:

    @use "igniteui-angular/theming" as *;
    
    // IMPORTANT: Prior to Ignite UI for Angular version 13 use:
    // @import '~igniteui-angular/lib/core/styles/themes/index';
    scss

    Al utilizar el enfoque más simple, creamos un nuevo tema que extiende el column-actions-theme y acepta los parámetros $title-color y $background-color.

    $custom-column-actions-theme: column-actions-theme(
      $background-color: #292826,
      $title-color: #ffcd0f
    );
    scss

    Como se ve, el column-actions-theme solo controla los colores del contenedor de acciones de columna, pero no afecta los botones, las casillas de verificación ni el grupo de entrada dentro de él. Digamos que también queremos darle estilo a los botones, así que crearemos un nuevo tema de botón:

    $custom-button: button-theme(
      $foreground: #292826, 
      $disabled-foreground: rgba(255, 255, 255, .54)
    );
    scss

    En lugar de codificar los valores de color como acabamos de hacer, podemos lograr una mayor flexibilidad en términos de colores mediante el uso de las palette funciones y color. Consulte el Palettes tema para obtener orientación detallada sobre cómo usarlos.

    En este ejemplo solo cambiamos el color del texto de los botones planos y el color deshabilitado del botón, pero el button-theme proporciona muchos más parámetros para controlar el estilo del botón.

    El último paso es incluir los mixins de componentes, cada uno con su respectiva temática:

    @include css-vars($custom-column-actions-theme);
    
    .igx-column-actions {
      @include css-vars($custom-button);
    }
    scss

    Incluimos el tema de botón creado dentro.igx-column-actions, de modo que solo se estilizaría a los botones de ocultación de columnas. De lo contrario, otros botones de la cuadrícula también se verían afectados.

    Si el componente está usando un Emulated ViewEncapsulation, es necesario que penetrate esta encapsulación use::ng-deep para los componentes dentro del componente de acción de columna (botones, casillas de verificación ... etcétera):

    @include css-vars($custom-column-actions-theme);
    
    :host {
      ::ng-deep {
        .igx-column-actions {
          @include css-vars($custom-button);
        }
      }
    }
    scss

    Manifestación

    EXAMPLE
    TS
    HTML
    SCSS

    Referencias de API

    En este artículo, aprendimos a usar la interfaz de usuario de ocultación de columnas incorporada en la barra de herramientas de la cuadrícula y también la definimos como un componente separado. Introdujimos una interfaz de usuario que permite al usuario elegir entre diferentes órdenes de columnas, y establecemos nuestro propio título personalizado y textos de solicitud de filtro. También utilizamos un componente Ignite UI for Angular adicional: el botón IgxRadio.

    La interfaz de usuario que oculta columnas tiene algunas API más para explorar, que se enumeran a continuación.

    Componentes adicionales y/o directivas con API relativas que se utilizaron:

    IgxGridComponent properties:

    IgxColumnComponent properties:

    IgxGridToolbarComponent properties:

    IgxGridToolbarComponent components:

    IgxGridToolbarComponent methods:

    IgxGridComponent events:

    Componente IgxRadio

    Styles:

    Recursos adicionales

    Nuestra comunidad es activa y siempre da la bienvenida a nuevas ideas.