Angular Tree Grid Summaries

    La cuadrícula de la interfaz de usuario de Angular en Ignite UI for Angular tiene una característica de resúmenes que funciona en un nivel por columna como pie de página de grupo. Angular resúmenes de cuadrícula es una característica poderosa que permite al usuario ver la información de la columna en un contenedor separado con un conjunto predefinido de elementos de resumen predeterminados, según el tipo de datos dentro de la columna o mediante la implementación de una plantilla angular personalizada en la cuadrícula del árbol.

    Ejemplo de resumen de resúmenes de cuadrícula de árbol de 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.

    El resumen de la columna es una función de todos los valores de la columna; a menos que se aplique un filtrado, el resumen de la columna será función de los valores de los resultados filtrados.

    Los resúmenes de cuadrícula de árbol también se pueden habilitar a nivel de columna en Ignite UI for Angular, lo que significa que solo puede activarlo para las columnas que necesite. Los resúmenes de cuadrícula de árbol le proporcionan un conjunto predefinido de resúmenes predeterminados, en función del tipo de datos de la columna, para que pueda ahorrar algo de tiempo:

    Para string y boolean ​ ​data types, está disponible la siguiente función:

    • contar

    Para los tipos de datos number, currency y percent, están disponibles las siguientes funciones:

    • contar
    • mín.
    • máximo
    • promedio
    • suma

    Para el tipo de datos date, están disponibles las siguientes funciones:

    • contar
    • más temprano
    • el último

    Todos los tipos de datos de columna disponibles se pueden encontrar en el tema oficial Tipos de columna.

    Los resúmenes de Tree Grid se habilitan por columna estableciendo la propiedad hasSummary en true. También es importante tener en cuenta que los resúmenes de cada columna se resuelven según el tipo de datos de la columna. En igx-tree-grid el tipo de datos de columna predeterminado es string, por lo que si desea resúmenes específicos number o date, debe especificar la propiedad dataType como number o date. Tenga en cuenta que los valores de resumen se mostrarán localizados, según la locale de la cuadrícula y la columna pipeArgs.

    <igx-tree-grid #grid1 [data]="data" [autoGenerate]="false" height="800px" width="800px" (columnInit)="initColumn($event)">
        <igx-column field="ID" header="Order ID" width="200px" [sortable]="true"></igx-column>
        <igx-column field="Name" header="Order Product" width="200px" [sortable]="true" [hasSummary]="true"></igx-column>
        <igx-column field="Units" width="200px" [editable]="true" [dataType]="'number'" [hasSummary]="true"></igx-column>
    </igx-tree-grid>
    html

    La otra forma de habilitar/deshabilitar resúmenes para una columna específica o una lista de columnas es usar el método público enableSummaries / disableSummaries del igx-tree-grid.

    <igx-tree-grid #grid1 [data]="data" [autoGenerate]="false" height="800px" width="800px" (columnInit)="initColumn($event)" >
        <igx-column field="ID" header="Order ID" width="200px" [sortable]="true"></igx-column>
        <igx-column field="Name" header="Order Product" width="200px" [sortable]="true" [hasSummary]="true" ></igx-column>
        <igx-column field="Units" width="200px" [editable]="true" [dataType]="'number'" [hasSummary]="false"></igx-column>
    
    </igx-tree-grid>
    <button (click)="enableSummary()">Enable Summary</button>
    <button (click)="disableSummary()">Disable Summary </button>
    html
    public enableSummary() {
        this.grid1.enableSummaries([
            {fieldName: 'Units', customSummary: this.mySummary},
            {fieldName: 'ID'}
        ]);
    }
    public disableSummary() {
        this.grid1.disableSummaries('Name');
    }
    typescript

    Resúmenes de cuadrícula de árbol personalizados

    Si estas funciones no cumplen con sus requisitos, puede proporcionar un resumen personalizado para las columnas específicas. Para lograr esto, debe anular una de las clases base IgxSummaryOperand, IgxNumberSummaryOperand o IgxDateSummaryOperand según el tipo de datos de la columna y sus necesidades. De esta manera puede redefinir la función existente o puede agregar nuevas funciones. La clase IgxSummaryOperand proporciona la implementación predeterminada solo para el método count. IgxNumberSummaryOperand extiende IgxSummaryOperand y proporciona implementación para min, max, sum y average. IgxDateSummaryOperand amplía IgxSummaryOperand y, además, le ofrece las versiones earliest y latest.

    import { IgxSummaryResult, IgxSummaryOperand, IgxNumberSummaryOperand, IgxDateSummaryOperand } from 'igniteui-angular';
    // import { IgxSummaryResult, IgxSummaryOperand, IgxNumberSummaryOperand, IgxDateSummaryOperand } from '@infragistics/igniteui-angular'; for licensed package
    
    class MySummary extends IgxNumberSummaryOperand {
        constructor() {
            super();
        }
    
        operate(data?: any[]): IgxSummaryResult[] {
            const result = super.operate(data);
            result.push({
                key: 'test',
                label: 'Test',
                summaryResult: data.filter(rec => rec > 10 && rec < 30).length
            });
            return result;
        }
    }
    typescript

    Como se ve en los ejemplos, las clases base exponen el método operate, por lo que puede elegir obtener todos los resúmenes predeterminados y modificar el resultado, o calcular resultados resumidos completamente nuevos. El método devuelve una lista de IgxSummaryResult.

    interface IgxSummaryResult {
        key: string;
        label: string;
        summaryResult: any;
    }
    typescript

    y tomar parámetros opcionales para calcular los resúmenes. Consulte Resúmenes personalizados, que acceden a toda la sección de datos a continuación.

    Para calcular correctamente la altura de la fila de resumen, Tree Grid necesita que el método operate devuelva siempre una matriz de IgxSummaryResult con la longitud adecuada incluso cuando los datos están vacíos.

    Y ahora agreguemos nuestro resumen personalizado a la columna UnitPrice. Lo lograremos estableciendo la propiedad summaries en la clase que creamos a continuación.

    <igx-tree-grid #grid1 [data]="data" [autoGenerate]="false" height="800px" width="800px" (columnInit)="initColumn($event)">
        <igx-column field="ID" header="Order ID" width="200px" [sortable]="true"></igx-column>
        <igx-column field="Name" header="Order Product" width="200px" [sortable]="true" [hasSummary]="true"></igx-column>
        <igx-column field="Units" [dataType]="'number'" width="200px" [editable]="true" [hasSummary]="true" [summaries]="mySummary"></igx-column>
        <igx-column field="UnitPrice" header="Unit Price" width="200px" [dataType]="'number'"  [dataType]="'currency'" [hasSummary]="true"></igx-column>
    </igx-tree-grid>
    html
    ...
    export class GridComponent implements OnInit {
        mySummary = MySummary;
        ....
    }
    typescript

    Resúmenes personalizados, que acceden a todos los datos

    Ahora puede acceder a todos los datos de Tree Grid dentro del resumen de columnas personalizado. Se introducen dos parámetros opcionales adicionales en el método operate IgxSummaryOperand. Como puede ver en el fragmento de código a continuación, el método de operación tiene los siguientes tres parámetros:

    • columnData: le proporciona una matriz que contiene los valores solo para la columna actual
    • allGridData: le brinda toda la fuente de datos de la cuadrícula
    • fieldName - campo de columna actual
    class MySummary extends IgxNumberSummaryOperand {
        constructor() {
            super();
        }
        operate(columnData: any[], allGridData = [], fieldName?): IgxSummaryResult[] {
            const result = super.operate(allData.map(r => r[fieldName]));
            result.push({ key: 'test', label: 'Total Undelivered', summaryResult: allData.filter((rec) => rec.Discontinued).length });
            return result;
        }
    }
    typescript

    EXAMPLE
    TS
    HTML
    SCSS

    Plantilla de resumen

    igxSummary apunta al resumen de la columna proporcionando como contexto los resultados del resumen de la columna.

    <igx-column ... [hasSummary]="true">
        <ng-template igxSummary let-summaryResults>
            <span> My custom summary template</span>
            <span>{{ summaryResults[0].label }} - {{ summaryResults[0].summaryResult }}</span>
        </ng-template>
    </igx-column>
    html

    Cuando se define un resumen predeterminado, la altura del área de resumen se calcula por diseño en función de la columna con el mayor número de resúmenes y el tamaño de la cuadrícula. Use la propiedad de entrada summaryRowHeight para invalidar el valor predeterminado. Como argumento, espera un valor numérico y, al establecer un valor falso, se activará el comportamiento de tamaño predeterminado del pie de página de la cuadrícula.

    La plantilla de resumen de columna se puede definir a través de API estableciendo la propiedad SummaryTemplate de la columna en el TemplateRef requerido.

    EXAMPLE
    TS
    HTML
    SCSS

    Desactivar resúmenes

    La disabledSummaries propiedad proporciona un control preciso por columna sobre la característica de resumen de cuadrícula Ignite UI for Angular. Esta propiedad permite a los usuarios personalizar los resúmenes que se muestran para cada columna de la cuadrícula, lo que garantiza que solo se muestren los datos más relevantes y significativos. Por ejemplo, puede excluir tipos de resumen específicos, por ejemplo ['count', 'min', 'max'], especificando sus claves de resumen en una matriz.

    Esta propiedad también se puede modificar dinámicamente en tiempo de ejecución a través del código, lo que proporciona flexibilidad para adaptar los resúmenes de la cuadrícula a los cambios en los estados de la aplicación o las acciones del usuario.

    En los ejemplos siguientes se muestra cómo utilizar la disabledSummaries propiedad para administrar resúmenes de diferentes columnas y excluir tipos de resumen predeterminados y personalizados específicos en la cuadrícula Ignite UI for Angular:

    <!-- custom summaries -->
    <igx-column
        field="Units"
        header="Units"
        dataType="number"
        [hasSummary]="true"
        [summaries]="unitsSummary"
        [disabledSummaries]="['uniqueCount', 'maxDifference']"
    >
    </igx-column>
    <!-- default summaries -->
    <igx-column
        field="UnitPrice"
        header="Unit Price"
        dataType="number"
        [hasSummary]="true"
        [disabledSummaries]="['count', 'sum', 'average']"
    >
    </igx-column>
    html

    En el caso Units de los resúmenes personalizados, como totalDelivered y totalNotDelivered se excluyen mediante la disabledSummaries propiedad.

    Para UnitPrice, los resúmenes predeterminados como count, sum, y average están deshabilitados, dejando otros como y min​ ​max activos.

    En tiempo de ejecución, los resúmenes también se pueden deshabilitar dinámicamente mediante la disabledSummaries propiedad. Por ejemplo, puede establecer o actualizar la propiedad en columnas específicas mediante programación para adaptar los resúmenes mostrados en función de las acciones del usuario o los cambios de estado de la aplicación.

    EXAMPLE

    Resúmenes de formato

    De forma predeterminada, los resultados de resumen, producidos por los operandos de resumen integrados, se localizan y se formatean según la locale de la cuadrícula y la columna pipeArgs. Cuando se utilizan operandos personalizados, la locale y pipeArgs no se aplican. Si desea cambiar la apariencia predeterminada de los resultados del resumen, puede formatearlos usando la propiedad summaryFormatter.

    public dateSummaryFormat(summary: IgxSummaryResult, summaryOperand: IgxSummaryOperand): string {
        const result = summary.summaryResult;
        if(summaryOperand instanceof IgxDateSummaryOperand && summary.key !== 'count'
            && result !== null && result !== undefined) {
            const pipe = new DatePipe('en-US');
            return pipe.transform(result,'MMM YYYY');
        }
        return result;
    }
    typescript
    <igx-column ... [summaryFormatter]="dateSummaryFormat"></igx-column>
    html

    EXAMPLE
    TS
    HTML
    SCSS

    App Builder | CTA Banner

    Resúmenes infantiles

    Tree Grid admite resúmenes separados para los nodos raíz y para cada nivel de nodo secundario anidado. Los resúmenes que se muestran se pueden configurar mediante la propiedad summaryCalculationMode. Los resúmenes de nivel secundario se pueden mostrar antes o después de los nodos secundarios utilizando la propiedad summaryPosition. Junto con estas dos propiedades, IgxTreeGrid expone una propiedad showSummaryOnCollapse que le permite determinar si la fila de resumen permanece visible cuando el nodo principal al que hace referencia está colapsado.

    Los valores disponibles de la propiedad summaryCalculationMode son:

    • rootLevelOnly: los resúmenes se calculan solo para los nodos del nivel raíz.
    • childLevelsOnly: los resúmenes se calculan solo para los niveles secundarios.
    • rootAndChildLevels: los resúmenes se calculan tanto para el nivel raíz como para el nivel secundario. Este es el valor predeterminado.

    Los valores disponibles de la propiedad summaryPosition son:

    • arriba: la fila de resumen aparece antes de la lista de filas secundarias.
    • abajo: la fila de resumen aparece después de la lista de filas secundarias. Este es el valor predeterminado.

    La propiedad showSummaryOnCollapse es booleana. Su valor predeterminado está establecido en false, lo que significa que la fila de resumen se ocultará cuando se contraiga la fila principal. Si la propiedad se establece en verdadero, la fila de resumen permanece visible cuando se contrae la fila principal.

    La propiedad summaryPosition se aplica solo a los resúmenes de nivel secundario. Los resúmenes del nivel raíz siempre aparecen fijos en la parte inferior del Tree Grid.

    EXAMPLE
    TS
    HTML
    SCSS

    Exportación de resúmenes

    Existe una opción exportSummaries en IgxExcelExporterOptions que especifica si los datos exportados deben incluir los resúmenes del grid. El valor predeterminado exportSummaries es falso.

    IgxExcelExporterService exportará los resúmenes predeterminados para todos los tipos de columnas como sus funciones de Excel equivalentes para que sigan funcionando correctamente cuando se modifique la hoja. Pruébelo usted mismo en el siguiente ejemplo:

    EXAMPLE
    TS
    HTML
    SCSS

    El archivo exportado incluye una columna oculta que contiene el nivel de cada DataRecord en la hoja. Este nivel se utiliza en los resúmenes para filtrar las celdas que deben incluirse en la función de resumen.

    En la siguiente tabla, puede encontrar la fórmula de Excel correspondiente a cada uno de los resúmenes predeterminados.

    Tipo de datos Función Función Excel
    string, boolean contar ="Contar: "&CONTAR.SI(inicio:fin, nivel de registro)
    number, currency, percent contar ="Contar: "&CONTAR.SI(inicio:fin, nivel de registro)
    mín. ="Min: "&MIN(IF(inicio:fin=nivel de registro, inicio de rango:fin de rango))
    máximo ="Máx: "&MAX(IF(inicio:fin=nivel de registro, inicio de rango:fin de rango))
    promedio ="Promedio: "&PROMEDIOIF(inicio:fin, nivel de registro, inicio de rango:fin de rango)
    suma ="Suma: "&SUMIF(inicio:fin, nivel de registro, inicio de rango:fin de rango)
    date contar ="Contar: "&CONTAR.SI(inicio:fin, nivel de registro)
    más temprano ="Más temprano: "& TEXT(MIN(IF(start:end=recordLevel, rangeStart:rangeEnd)), formato)
    el último ="Último: "&TEXT(MAX(IF(start:end=recordLevel, rangeStart:rangeEnd)), formato)

    Limitaciones conocidas

    Limitación Descripción
    Exportar resúmenes personalizados Los resúmenes personalizados se exportarán como cadenas en lugar de funciones de Excel.
    Exportar resúmenes con plantillas Los resúmenes con plantilla no son compatibles y se exportarán como los predeterminados.

    Navegación por teclado

    Se puede navegar por las filas de resumen con las siguientes interacciones de teclado:

    • ARRIBA: navega una celda hacia arriba
    • ABAJO: navega una celda hacia abajo
    • IZQUIERDA: navega una celda hacia la izquierda
    • DERECHA: navega una celda hacia la derecha
    • CTRL + IZQUIERDA o INICIO: navega a la celda más a la izquierda
    • CTRL + DERECHA o FINAL: navega a la celda más a la derecha

    Estilo

    Para comenzar a diseñar el comportamiento de clasificación, necesitamos importar el archivo index, 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

    Siguiendo el enfoque más simple, creamos un nuevo tema que extiende el grid-summary-theme y acepta $background-color, $focus-background-color, $label-color, $result-color, $pinned-border-width, Parámetros $pinned-border-style y $pinned-border-color.

    $custom-theme: grid-summary-theme(
      $background-color: #e0f3ff,
      $focus-background-color: rgba(#94d1f7, .3),
      $label-color: #e41c77,
      $result-color: black,
      $pinned-border-width: 2px,
      $pinned-border-style: dotted,
      $pinned-border-color: #e41c77
    );
    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.

    El último paso es incluir el tema personalizado del componente:

    @include css-vars($custom-theme);
    scss

    Si el componente utiliza una ViewEncapsulation Emulated, es necesario penetrate esta encapsulación usando::ng-deep:

    :host {
     ::ng-deep {
       @include css-vars($custom-theme);
     }
    }
    scss

    Manifestación

    EXAMPLE
    TS
    HTML
    SCSS

    Referencias de API

    Recursos adicionales

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