Estilo condicional de cuadrícula de árbol Angular

    Si necesita proporcionar algún estilo personalizado en el componente IgxTreeGrid, puede hacerlo a nivel de fila o de celda.

    Estilo de fila condicional de cuadrícula de árbol

    El componente IgxTreeGrid de Ignite UI for Angular proporciona dos formas de aplicar estilos condicionales a las filas en función de reglas personalizadas.

    • By setting rowClasses input on the IgxTreeGrid component;
    • Al configurar la entrada rowStyles en el componente IgxTreeGrid;

    Más adelante en este tema los cubriremos con más detalle.

    Usando clases de fila

    Puede diseñar condicionalmente las filas de IgxTreeGrid configurando la entrada rowClasses y definiendo reglas personalizadas.

    <!-- sample.component.html -->
    <igx-tree-grid #treeGrid [data]="data" [height]="'600px'" [width]="'100%'" [rowClasses]="rowClasses">
        ...
    </igx-tree-grid>
    html

    La entrada rowClasses acepta un objeto literal, que contiene pares clave-valor, donde la clave es el nombre de la clase CSS, mientras que el valor es una función de devolución de llamada que devuelve un valor booleano o booleano.

    // sample.component.ts
    
    public rowClasses = {
      activeRow: this.activeRowCondition
    };
    
    public activeRowCondition = (row: RowType) => this.grid?.navigation.activeNode?.row === row.index;
    typescript
    // sample.component.scss
    
    ::ng-deep {
     .activeRow {
      border: 2px solid #fc81b8;
      border-left: 3px solid #e41c77;
     }
    }
    scss

    Utilice::ng-deep o ViewEncapsulation.None para forzar los estilos personalizados hacia abajo a través del componente actual y sus elementos secundarios.

    Manifestación

    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.

    Usando estilos de fila

    Las columnas ahora exponen la propiedad rowStyles que permite aplicar estilos condicionales a las filas de datos. Similar a rowClasses acepta un objeto literal donde las claves son propiedades de estilo y los valores son expresiones para evaluación. Además, puedes aplicar un peinado regular (sin condiciones).

    La firma de devolución de llamada tanto para rowStyles como para rowClasses es:

    (row: RowType) => boolean
    ts

    Definamos nuestros estilos:

    // component.ts
    public background = (row: RowType) => row.data['Title'] === 'CEO' ? '#6c757d' :
        row.data['Title'].includes('President') ? '#adb5bd' :
        row.data['Title'].includes('Director') ?  '#ced4da' :
        row.data['Title'].includes('Manager') ? '#dee2e6' :
        row.data['Title'].includes('Lead') ? '#e9ecef' :
        row.data['Title'].includes('Senior') ? '#f8f9fa' : null;
    
    public rowStyles = {
        background: this.background,
        'border-left': (row: RowType) => row.data['Title'] === 'CEO' || row.data['Title'].includes('President') ?
            '2px solid' : null,
        'border-color': (row: RowType) => row.data['Title'] === 'CEO' ? '#495057' : null,
        color: (row: RowType) => row.data['Title'] === 'CEO' ? '#fff' : null
    };
    typescript
    <!-- sample.component.html -->
    <igx-tree-grid #treeGrid [data]="data" [moving]="true" primaryKey="ID" foreignKey="ParentID"
            width="100%" height="550px" [rowStyles]="rowStyles">
        ...
    </igx-tree-grid>
    html

    Manifestación

    EXAMPLE
    TS
    HTML
    SCSS

    Estilo de celda condicional de cuadrícula de árbol

    Descripción general

    El componente IgxTreeGrid de Ignite UI for Angular proporciona dos formas de aplicar estilos condicionales a las celdas en función de reglas personalizadas.

    • Configurando las cellClasses de entrada IgxColumnComponent en un objeto literal que contiene pares clave-valor. La clave es el nombre de la clase CSS, mientras que el valor es una función de devolución de llamada que devuelve un valor booleano o booleano. El resultado es una cómoda colocación del material en la celda.
    // component.ts file
    public beatsPerMinuteClasses = {
        downFont: this.downFontCondition,
        upFont: this.upFontCondition
    };
    ...
    
    private downFontCondition = (rowData: any, columnKey: any): boolean => {
        return rowData[columnKey] <= 95;
    }
    ts
    // component.scss file
    .upFont {
      color: red;
    }
    
    .downFont {
      color: green;
    }
    scss

    Usando clases de celdas

    Puede diseñar condicionalmente las celdas IgxTreeGrid configurando la entrada IgxColumnComponent ​ ​cellClasses y definiendo reglas personalizadas.

    <!-- sample.component.html -->
    <igx-column field="UnitPrice" header="Unit Price" [dataType]="'currency'" [pipeArgs]="formatOptions" [cellClasses]="priceClasses"></igx-column>
    html

    La entrada cellClasses acepta un objeto literal, que contiene pares clave-valor, donde la clave es el nombre de la clase CSS, mientras que el valor es una función de devolución de llamada que devuelve un valor booleano o booleano.

    // sample.component.ts
    
    private upPriceCondition = (rowData: any, columnKey: any): boolean => {
        return rowData[columnKey] > 5;
    }
    
    private downPriceCondition = (rowData: any, columnKey: any): boolean => {
        return rowData[columnKey] <= 5;
    }
    
    public priceClasses = {
        downPrice: this.downPriceCondition,
        upPrice: this.upPriceCondition
    };
    typescript
    // sample.component.scss
    
    ::ng-deep {
        .upPrice {
            color: red;
        }
    
        .downPrice {
            color: green;
        }
    }
    scss

    Utilice::ng-deep o ViewEncapsulation.None para forzar los estilos personalizados hacia abajo a través del componente actual y sus elementos secundarios.

    Manifestación

    EXAMPLE
    TS
    HTML
    SCSS

    • Utilizando la entrada cellStyles​ ​IgxColumnComponent, que acepta un objeto literal donde las claves son propiedades de estilo y los valores son expresiones para evaluación.
    public styles = {
        'background': 'linear-gradient(180deg, #dd4c4c 0%, firebrick 100%)',
        'text-shadow': '1px 1px 2px rgba(25,25,25,.25)',
        'animation': '0.25s ease-in-out forwards alternate popin'
    };
    ts

    La firma de devolución de llamada para cellStyles y cellClasses ahora se cambia a:

    (rowData: any, columnKey: string, cellValue: any, rowIndex: number) => boolean
    ts

    Usando estilos de celda

    Las columnas ahora exponen la propiedad cellStyles que permite aplicar estilos condicionales a las celdas de las columnas. Al igual que cellClasses acepta un objeto literal donde las claves son propiedades de estilo y los valores son expresiones para evaluación. Además, puedes aplicar el peinado habitual con facilidad (sin condiciones).

    En el ejemplo anterior hemos creado:

    • Dos estilos diferentes que se aplicarán según el índice de la columna.
    • También cambiará el text color según las filas pares/impares.

    La firma de devolución de llamada para ambos cellStyles es:

    (rowData: any, columnKey: string, cellValue: any, rowIndex: number) => boolean
    ts

    Definamos nuestros estilos:

    // component.ts
    public oddColStyles = {
        background: 'linear-gradient(to right, #b993d6, #8ca6db)',
        color: (rowData, coljey, cellValue, rowIndex) => rowIndex % 2 === 0 ? 'white' : 'gray',
        animation: '0.75s popin'
    };
    
    public evenColStyles = {
        background: 'linear-gradient(to right, #8ca6db, #b993d6)',
        color: (rowData, coljey, cellValue, rowIndex) => rowIndex % 2 === 0 ? 'gray' : 'white',
        animation: '0.75s popin'
    };
    typescript

    En ngOnInit agregaremos la configuración cellStyles para cada columna de la colección columns predefinidas, que se utiliza para crear las columnas IgxTreeGrid dinámicamente.

    // component.ts
    public ngOnInit() {
        this.data = ORDERS_DATA;
         this.columns = [
            { field: 'ID' },
            { field: 'Name' },
            { field: 'UnitPrice' },
            { field: 'OrderDate' }
        ];
    
        this.applyCSS();
    }
    ts
    public applyCSS() {
        this.columns.forEach((column, index) => {
            column.cellStyles = (index % 2 === 0 ? this.evenColStyles : this.oddColStyles);
        });
    }
    
    public updateCSS(css: string) {
        this.oddColStyles = {...this.oddColStyles, ...JSON.parse(css)};
        this.evenColStyles = {...this.evenColStyles, ...JSON.parse(css)};
        this.applyCSS();
    }
    ts
    //component.html
    <igx-tree-grid
        #grid1 [data]="data"
        primaryKey="ID" foreignKey="ParentID"
        height="350px">
        <igx-column *ngFor="let c of columns"
            [field]="c.field"
            [header]="c.header"
            [cellStyles]="c.cellStyles">
        </igx-column>
    </igx-tree-grid>
    html

    Definir una animación popin

    // component.scss
    @keyframes popin {
        0% {
            opacity: 0.1;
            transform: scale(.75, .75);
            filter: blur(3px) invert(1);
        }
    
        50% {
            opacity: .5;
            filter: blur(1px);
        }
    
        100% {
            transform: scale(1, 1);
            opacity: 1;
            filter: none;
        }
    }
    scss

    Manifestación

    EXAMPLE
    TS
    HTML
    SCSS

    Problemas y limitaciones conocidos

    • Si hay celdas enlazadas a la misma condición (de diferentes columnas) y una celda se actualiza, las demás celdas no se actualizarán en función del nuevo valor, si se cumple la condición. Se debe realizar una verificación de tubería para aplicar los cambios al resto de las celdas. En el ejemplo siguiente se muestra cómo hacerlo con un spread operator(...) evento on onCellEdit. Esto copiará el objeto original con una nueva instancia y hará que se dispare la tubería pura.
    public backgroundClasses = {
        myBackground: (rowData: any, columnKey: string) => {
            return rowData.Col2 < 10;
        }
    };
    ...
    
    editDone(evt) {
        this.backgroundClasses = {...this.backgroundClasses};
    }
    
    ts
    <igx-tree-grid #grid1 [data]="data" height="500px" width="100%" (onCellEdit)="editDone($event)">
      <igx-column field="Col1" dataType="number" [cellClasses]="backgroundClasses"></igx-column>
      <igx-column field="Col2" dataType="number" [editable]="true" [cellClasses]="backgroundClasses"></igx-column>
      <igx-column field="Col3" header="Col3" dataType="string" [cellClasses]="backgroundClasses"></igx-column>
    </igx-tree-grid>
    html
    App Builder | CTA Banner

    Referencias de API

    Recursos adicionales

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