Angular Tree Grid Row Editing
Tree Grid proporciona una forma conveniente de realizar manipulaciones de datos mediante edición en línea y una potente API para operaciones Angular CRUD. Haga clic en una fila y presione la tecla Enter o simplemente haga doble clic con el mouse en la fila que desea modificar.
Angular Tree Grid Row Editing Example
El siguiente ejemplo demuestra cómo habilitar la edición de filas en la cuadrícula de árbol. Cambiar el valor de una celda y luego hacer clic o navegar a otra celda en la misma fila no actualizará el valor de la fila hasta que se confirme usando el botón Listo o se descarte usando el botón Cancelar.
Note
Cuando una fila está en modo de edición, al hacer clic en una celda de otra fila se actuará como si se presionara el botón Listo: envíe todos los cambios de la fila anterior. Si la nueva celda que recibe el foco es editable, entonces la nueva fila también ingresa al modo de edición, mientras que si la celda no es editable, solo la fila anterior sale del modo de edición.
Row Editing Usage
Para comenzar, importe IgxTreeGridModule
en el archivo app.module.ts:
// app.module.ts
...
import { IgxTreeGridModule } from 'igniteui-angular';
@NgModule({
...
imports: [..., IgxTreeGridModule],
...
})
export class AppModule {}
Luego defina una cuadrícula de árbol con fuente de datos vinculada y rowEditable
establecida en verdadero:
<igx-tree-grid [data]="data" [primaryKey]="EmployeID" [foreignKey]="PID"
[rowEditable]="true" [rowSelection]="'multiple'" [moving]="true">
<igx-column *ngFor="let c of columns"
[editable] ="c.editable"
[field]="c.field"
[dataType]="c.dataType"
[header]="c.label"
[resizable]="c.resizable"
[sortable]="c.sortable"
[filterable]="c.filterable">
</igx-column>
</igx-tree-grid>
Note
La configuración de la clave principal es obligatoria para las operaciones de edición de filas.
Note
No es necesario habilitar la edición de columnas individuales. El uso de la propiedad rowEditable
en la cuadrícula de árbol significará que todas las filas, con la propiedad de field
definida, excluyendo la principal, serán editables. Si desea deshabilitar la edición de una columna específica, establezca la entrada de la columna editable
en false
.
import { Component, OnInit, ViewChild } from '@angular/core';
import { IgxTreeGridComponent } from 'igniteui-angular';
// import { IgxTreeGridComponent } from '@infragistics/igniteui-angular'; for licensed package
import { FLAT_DATA } from './data';
@Component({
providers: [],
selector: 'app-tree-grid-row-editing-sample',
styleUrls: ['tree-grid-row-editing-sample.component.scss'],
templateUrl: 'tree-grid-row-editing-sample.component.html'
})
export class TreeGridRowEditSampleComponent implements OnInit {
public data: any[];
public columns: any[];
@ViewChild('treeGrid') public treeGrid: IgxTreeGridComponent;
public ngOnInit(): void {
this.data = FLAT_DATA;
this.columns = [
{ field: 'FirstName', label: 'First Name', resizable: true, sortable: true, filterable: true, editable: true, dataType: 'string' },
{ field: 'LastName', label: 'Last Name', resizable: false, sortable: false, filterable: false, editable: true, dataType: 'string' },
{ field: 'Title', label: 'Title', resizable: true, sortable: true, filterable: true, editable: true, dataType: 'string' },
{ field: 'HireDate', label: 'Hire Date', resizable: true, sortable: true, filterable: true, editable: true, dataType: 'date' }
];
}
}
Note
Tree Grid utiliza internamente un proveedor IgxBaseTransactionService
que mantiene los cambios de celda pendientes, hasta que se envía o cancela el estado de la fila.
Positioning
La posición predeterminada de la superposición estará debajo de la fila que está en modo de edición.
Si no hay espacio debajo de la fila, aparecerá una superposición encima de la fila.
Una vez que se muestra, arriba o abajo, la superposición mantendrá esta posición durante el desplazamiento, hasta que se cierre la superposición.
Behavior
Si la fila está en modo de edición, la edición continuará si se hace clic en una celda de la misma fila.
Al hacer clic en el botón "Listo", finalizará la edición de la fila y enviará los cambios a la fuente de datos o a una transacción, si está disponible. Además, la fila saldrá del modo de edición.
Al hacer clic en el botón "Cancelar", se revertirán todos los cambios actuales en la fila y la fila saldrá del modo de edición.
Si la fila está en modo de edición, al hacer clic en una celda de otra fila finalizará la edición de la fila actual y se enviarán nuevos cambios en la fila (el mismo comportamiento al hacer clic en el botón "Listo"). Si la nueva celda que recibe el foco es editable, entonces la nueva fila también ingresa al modo de edición, mientras que si la celda no es editable, solo la fila anterior sale del modo de edición.
Si la fila está en modo de edición y la cuadrícula de árbol se desplaza de modo que esa fila salga del área visible, esta última seguirá en modo de edición. Cuando se desplaza la Cuadrícula de árbol, para que la fila vuelva a ser visible, la fila seguirá en modo de edición. Cuando se hace clic fuera de la cuadrícula de árbol, la celda también permanecerá en modo de edición.
Al realizar operaciones de clasificación, filtrado, búsqueda y ocultación, se revertirán todos los cambios actuales en la fila y la fila saldrá del modo de edición.
Al realizar operaciones de paginación, cambio de tamaño, fijación y movimiento, saldrá del modo de edición y enviará el último valor.
Cada celda modificada obtiene un estilo editado hasta que finaliza la edición de la fila. Este es el comportamiento cuando Tree Grid no cuenta con transacciones. Cuando las transacciones están disponibles, se aplica el estilo de edición de celda hasta que se confirmen todos los cambios.
Keyboard Navigation
Enter
yF2
ingresa al modo de edición de filasEsc
sale del modo de edición de filas y no envía ninguno de los cambios de celda realizados mientras la fila estaba en modo de edición.Tab
mueve el foco de una celda editable en la fila a la siguiente y de la celda editable más a la derecha a los botones CANCELAR y LISTO. La navegación desde el botón LISTO va a la celda editable más a la izquierda dentro de la fila actualmente editada.
Feature Integration
Cualquier operación de cambio de datos finalizará las operaciones de edición de filas y enviará los cambios de filas actuales. Esto incluirá operaciones como ordenar, cambiar criterios de agrupación y filtrado, paginación, etc.
Los resúmenes se actualizarán una vez finalizada la edición de la fila. Lo mismo es válido para otras funciones como ordenar, filtrar, etc.
Customizing Row Editing Overlay
Customizing Text
Es posible personalizar el texto de la superposición de edición de filas utilizando igxRowEditTextDirective
. La propiedad rowChangesCount
está expuesta y contiene el recuento de celdas modificadas.
<ng-template igxRowEditText let-rowChangesCount>
Changes: {{rowChangesCount}}
</ng-template>
Customizing Buttons
Es posible personalizar los botones de la superposición de edición de filas utilizando igxRowEditActionsDirective
. Si desea que los botones formen parte de la navegación del teclado, cada uno de ellos debe tener igxRowEditTabStopDirective
.
<ng-template igxRowEditActions let-endRowEdit>
<button igxButton igxRowEditTabStop (click)="endRowEdit(false)">Cancel</button>
<button igxButton igxRowEditTabStop (click)="endRowEdit(true)">Apply</button>
</ng-template>
Estilismo
Usando la Ignite UI for Angular, podemos alterar en gran medida la superposición de edición de filas. La superposición de edición de filas es un elemento compuesto: su interfaz de usuario se compone de un par de otros componentes: -igx-banner
para representar su contenido -igx-button
se representan en la plantilla predeterminada (para los botones Done
y Cancel
).
En el siguiente ejemplo, utilizaremos las opciones de estilo de esos dos componentes ([estilo de botón](../button.md# Estilo de botón Angular) y estilo de banner), para personalizar la experiencia de edición de filas de nuestro IgxTreeGrid. También aplicaremos estilo al editor y al fondo de la celda actual para hacerlo más distintivo. Puede obtener más información sobre el diseño de celdas aquí.
Import theme
La forma más sencilla de aplicar estilo al banner de Edición de filas es definir estilos en el archivo de estilo global de nuestra app
(normalmente styles.scss
). Lo primero que debemos hacer es importar el archivo themes/index
; esto nos da acceso a todas las poderosas herramientas de Ignite UI for Angular Sass:
@use "igniteui-angular/theming" as *;
// IMPORTANT: Prior to Ignite UI for Angular version 13 use:
// @import '~igniteui-angular/lib/core/styles/themes/index';
Una vez que hayamos importado el archivo de temas, podemos crear temas personalizados.
Definir el tema
Ahora podemos definir un banner theme
personalizado que afectará nuestro fondo de edición de filas y utilizará una de las paletas predefinidas, a saber, $purple-palette
:
$my-light-gray: #e3e3e3;
$my-banner-palette: $purple-palette;
$banner-theme: banner-theme(
$banner-background: $my-light-gray,
$banner-message-color: color($my-banner-palette, "secondary", 600)
);
Aquí estamos usando my-banner-palette
junto con igx-color
(expuesto por la biblioteca de temas) para generar nuestros colores.
Include the theme
Todo lo que tenemos que hacer ahora es aplicar el tema con una declaración Sass @include
. Pasamos nuestro $banner-theme
recién definido a través del igx-banner mixin
:
@include banner($banner-theme);
Esto aplicará nuestro tema de banner personalizado a la superposición de Edición de filas. Sin embargo, dado que los definimos en el archivo de estilos globales, estos estilos también se aplicarán a todos los banners de nuestra aplicación.
Component styles
Dado que la superposición de Edición de filas utiliza muchos temas de otros componentes, diseñarla mediante estilos globales puede afectar otras partes de nuestra aplicación (por ejemplo, pancartas, botones, etc.). La mejor manera de evitarlo es definir el alcance de nuestro tema de banner. Podemos definir nuestros estilos (incluida la theme/index
importación ) en el componente que contiene nuestro igx-tree-grid.
Note
Si el componente utiliza una ViewEncapsulation Emulated
, es necesario penetrar esta encapsulación usando::ng-deep
para poder diseñar la cuadrícula. Envolvemos la declaración dentro de un selector:host
para evitar que nuestros estilos afecten a elementos fuera de nuestro componente:
// custom.component.scss
:host {
::ng-deep {
@include banner($banner-theme);
}
}
Con la sintaxis anterior, nuestro tema de banner personalizado se aplica correctamente a la superposición de edición de filas de la cuadrícula.
Custom Templates
Para personalizar aún más nuestra superposición de Edición de filas, podemos pasar una plantilla personalizada para poder diseñar los botones Done
y Cancel
por separado:
<!-- in component.html -->
<igx-tree-grid>
<ng-template igxRowEditActions let-endRowEdit>
<div class="custom-buttons">
<button igxIconButton="flat" class="custom-button" igxRowEditTabStop (click)="endRowEdit(false)">
<igx-icon>clear</igx-icon>
</button>
<button igxIconButton="flat" class="custom-button" igxRowEditTabStop (click)="endRowEdit(true)">
<igx-icon>check</igx-icon>
</button>
</div>
</ng-template>
</igx-tree-grid>
Una vez que hayamos definido nuestros botones personalizados, podemos utilizar el button-theme
para darles estilo. Puede obtener más información sobre el estilo igx-button
aquí. Podemos crear un tema personalizado para nuestro Done
y Cancel
:
// custom.component.scss
...
$button-theme: button-theme(
$palette: $purple-palette
);
...
.custom-buttons {
@include button($button-theme);
}
Ajustamos nuestra declaración @include
en.custom-buttons
para que solo se aplique a los botones Done
y Cancel
.
Demo
Después de diseñar el banner y los botones, también definimos un estilo personalizado para la celda en modo de edición. El resultado de todos los estilos combinados se puede ver a continuación:
Note
La muestra no se verá afectada por el tema global seleccionado en Change Theme
.
Known Issues and Limitations
- Cuando la cuadrícula no tiene un conjunto
primaryKey
y los escenarios de datos remotos están habilitados (al paginar, ordenar, filtrar y desplazar solicitudes de activación a un servidor remoto para recuperar los datos que se mostrarán en la cuadrícula), una fila perderá el siguiente estado después de un dato. solicitud completa:- Selección de fila
- Fila Expandir/contraer
- Edición de filas
- Fijación de filas
API References
- filaEditable
- onRowEditEnter
- en fila
- filaEditarHecho
- onRowEditCancel
- fin
- campo
- editable
- Clave primaria
- Componente IgxTreeGrid
Additional Resources
- Cree operaciones CRUD con igxGrid
- Descripción general de la cuadrícula de árbol
- Edición de cuadrícula de árbol
- Tree Grid Transactions