Affiche un tableau avec un en-tête et des lignes fixes. Le tableau implémente la fonctionnalité suivante :
- Disposition flexible : les en-têtes de tableau acceptent une variété de tailles pour permettre des mises en page fluides et fixes. Vous pouvez trouver plus d'informations sur la façon de personnaliser vos colonnes en vérifiant
TableHeaderCell
. - Tri : les éléments transmis peuvent être triés en interne par la table en fonction de l'état de tri actuel de la table. Vous pouvez trouver plus d'informations sur le tri en cochant
TableHeaderCell
. - Sélection de ligne : les lignes peuvent être sélectionnées via des cases à cocher sur le côté droit. Vous pouvez trouver plus d'informations dans la propriété
selected
. - Actions de ligne : des actions contextuelles peuvent être déclenchées par ligne, permettant à l'utilisateur d'accéder à des fonctionnalités sur elles. Vous pouvez trouver plus d'informations sur la façon de les ajouter dans
TableRow
. - Cellules prédéfinies personnalisées : certains modèles très courants pour les cellules (titre d'entité, métriques, etc.) sont déjà fournis par la plateforme, de sorte que vous n'avez qu'à les renvoyer dans le cadre de votre ligne.
- Virtualisation : les cellules ne sont rendues que si elles sont affichées à l'écran. Cela permet à la table de fonctionner avec un grand ensemble de données sans pratiquement aucune pénalité de performances.
Usage
import { Table } from 'nr1'
Exemples
Basique
class Example extends React.Component { _getActions() { return [ { label: 'Show details', onClick: (evt, { item, index }) => { alert( `Show details:Item: ${index}${JSON.stringify(item, null, 2)}`, ); }, }, { label: 'Delete', type: TableRow.ACTION_TYPE.DESTRUCTIVE, onClick: (evt, { item, index }) => { alert(`Delete:Item: ${index}${JSON.stringify(item, null, 2)}`); }, }, ]; }
_getItems() { return [ { name: 'Melton Garcia', gender: 'Male', company: 'Comtest', phone: '+1 (867) 477-3284', selected: true, }, { name: 'Finley Mendez', gender: 'Male', company: 'Anarco', phone: '+1 (817) 438-3205', selected: false, }, { name: 'Coleen Salinas', gender: 'Female', company: 'Macronaut', phone: '+1 (962) 419-3856', selected: true, }, ]; }
render() { return ( <Table items={this._getItems()}> <TableHeader> <TableHeaderCell value={({ item }) => item.name} width="50%"> Name </TableHeaderCell> <TableHeaderCell value={({ item }) => item.gender}> Gender </TableHeaderCell> <TableHeaderCell value={({ item }) => item.company}> Company </TableHeaderCell> <TableHeaderCell value={({ item }) => item.phone} width="fit-content" alignmentType={TableRowCell.ALIGNMENT_TYPE.RIGHT} > Phone </TableHeaderCell> </TableHeader>
{({ item }) => ( <TableRow actions={this._getActions()}> <TableRowCell>{item.name}</TableRowCell> <TableRowCell>{item.gender}</TableRowCell> <TableRowCell>{item.company}</TableRowCell> <TableRowCell>{item.phone}</TableRowCell> </TableRow> )} </Table> ); }}
Tri
class Example extends React.Component { constructor() { super(...arguments);
this.state = { column_0: TableHeaderCell.SORTING_TYPE.ASCENDING, }; }
_getItems() { return [ { name: 'Melton Garcia', gender: 'Male', company: 'Comtest', phone: '+1 (867) 477-3284', selected: true, }, { name: 'Finley Mendez', gender: 'Male', company: 'Anarco', phone: '+1 (817) 438-3205', selected: false, }, { name: 'Coleen Salinas', gender: 'Female', company: 'Macronaut', phone: '+1 (962) 419-3856', selected: true, }, ]; }
_onClickTableHeaderCell(key, event, sortingData) { this.setState({ [key]: sortingData.nextSortingType }); }
render() { return ( <Table items={this._getItems()} selected={({ item }) => item.selected} onSelect={(evt, { item }) => (item.selected = evt.target.checked)} > <TableHeader> <TableHeaderCell value={({ item }) => item.name} sortable sortingType={this.state.column_0} sortingOrder={1} onClick={this._onClickTableHeaderCell.bind(this, 'column_0')} > Name </TableHeaderCell> <TableHeaderCell value={({ item }) => item.gender} sortable sortingType={this.state.column_1} sortingOrder={0} onClick={this._onClickTableHeaderCell.bind(this, 'column_1')} > Gender </TableHeaderCell> <TableHeaderCell value={({ item }) => item.company} sortable sortingType={this.state.column_2} sortingOrder={2} onClick={this._onClickTableHeaderCell.bind(this, 'column_2')} > Company </TableHeaderCell> <TableHeaderCell value={({ item }) => item.phone}> Phone </TableHeaderCell> </TableHeader>
{({ item }) => ( <TableRow> <TableRowCell>{item.name}</TableRowCell> <TableRowCell>{item.gender}</TableRowCell> <TableRowCell>{item.company}</TableRowCell> <TableRowCell>{item.phone}</TableRowCell> </TableRow> )} </Table> ); }}
Avec les actions d'en-tête
class Example extends React.Component { _getActions() { return [ { label: 'Copy details', iconType: TableRow.ACTIONS_ICON_TYPE.INTERFACE__OPERATIONS__COPY_TO, onClick: (evt, { items }) => { alert(`Copy details: ${JSON.stringify(items, null, 2)}`); }, }, { label: 'Delete', iconType: TableRow.ACTIONS_ICON_TYPE.INTERFACE__OPERATIONS__TRASH, onClick: (evt, { items }) => { alert(`Delete: ${JSON.stringify(items, null, 2)}`); }, }, ]; }
_getItems() { return [ { name: 'Melton Garcia', gender: 'Male', company: 'Comtest', phone: '+1 (867) 477-3284', selected: true, }, { name: 'Finley Mendez', gender: 'Male', company: 'Anarco', phone: '+1 (817) 438-3205', selected: false, }, { name: 'Coleen Salinas', gender: 'Female', company: 'Macronaut', phone: '+1 (962) 419-3856', selected: true, }, ]; }
render() { return ( <Table items={this._getItems()} selected={({ item }) => item.selected} onSelect={(evt, { item }) => (item.selected = evt.target.checked)} > <TableHeader actions={this._getActions()}> <TableHeaderCell value={({ item }) => item.name} width="50%"> Name </TableHeaderCell> <TableHeaderCell value={({ item }) => item.gender}> Gender </TableHeaderCell> <TableHeaderCell value={({ item }) => item.company}> Company </TableHeaderCell> <TableHeaderCell value={({ item }) => item.phone} width="fit-content" alignmentType={TableRowCell.ALIGNMENT_TYPE.RIGHT} > Phone </TableHeaderCell> </TableHeader>
{({ item }) => ( <TableRow> <TableRowCell>{item.name}</TableRowCell> <TableRowCell>{item.gender}</TableRowCell> <TableRowCell>{item.company}</TableRowCell> <TableRowCell>{item.phone}</TableRowCell> </TableRow> )} </Table> ); }}
Avec un seul type de sélection
class Example extends React.Component { constructor() { super(...arguments);
this.state = { selectedRow: null, }; }
_getItems() { return [ { name: 'Melton Garcia', gender: 'Male', company: 'Comtest', phone: '+1 (867) 477-3284', }, { name: 'Finley Mendez', gender: 'Male', company: 'Anarco', phone: '+1 (817) 438-3205', }, { name: 'Coleen Salinas', gender: 'Female', company: 'Macronaut', phone: '+1 (962) 419-3856', }, ]; }
render() { return ( <Table selectionType={Table.SELECTION_TYPE.SINGLE} items={this._getItems()} selected={({ index }) => index === this.state.selectedRow} onSelect={(evt, { index }) => { this.setState((prevState) => { const { selectedRow } = prevState;
// When the selected row is clicked, set value to `null` return { selectedRow: selectedRow === index ? null : index }; }); }} > <TableHeader> <TableHeaderCell value={({ item }) => item.name}> Name </TableHeaderCell> <TableHeaderCell value={({ item }) => item.gender}> Gender </TableHeaderCell> <TableHeaderCell value={({ item }) => item.company}> Company </TableHeaderCell> <TableHeaderCell value={({ item }) => item.phone}> Phone </TableHeaderCell> </TableHeader>
{({ item }) => ( <TableRow> <TableRowCell>{item.name}</TableRowCell> <TableRowCell>{item.gender}</TableRowCell> <TableRowCell>{item.company}</TableRowCell> <TableRowCell>{item.phone}</TableRowCell> </TableRow> )} </Table> ); }}
Tri sur une seule colonne
class Example extends React.Component { constructor(...args) { super(...args);
this.state = { column: 0, sortingType: TableHeaderCell.SORTING_TYPE.NONE, };
this.exampleItems = [ { x: 'A', y: 0 }, { x: 'B', y: 0 }, { x: 'A', y: 1 }, ]; }
_onClickTableHeaderCell(column, evt, { nextSortingType }) { if (column === this.state.column) { this.setState({ sortingType: nextSortingType }); } else { this.setState({ column: column, sortingType: nextSortingType }); } }
render() { const sortingType0 = this.state.column === 0 ? this.state.sortingType : TableHeaderCell.SORTING_TYPE.NONE;
const sortingType1 = this.state.column === 1 ? this.state.sortingType : TableHeaderCell.SORTING_TYPE.NONE;
return ( <Table items={this.exampleItems}> <TableHeader> <TableHeaderCell sortable sortingType={sortingType0} onClick={this._onClickTableHeaderCell.bind(this, 0)} value={({ item }) => item.x} > Column 1 </TableHeaderCell>
<TableHeaderCell sortable sortingType={sortingType1} onClick={this._onClickTableHeaderCell.bind(this, 1)} value={({ item }) => item.y} > Column 2 </TableHeaderCell> </TableHeader>
{({ item }) => ( <TableRow> <TableRowCell>{item.x}</TableRowCell> <TableRowCell>{item.y}</TableRowCell> </TableRow> )} </Table> ); }}
Interrogation (query) avec tableau
<EntitiesByDomainTypeQuery entityDomain="APM" entityType="APPLICATION"> {({ error, data, fetchMore }) => { if (!data.entities.length && error) { return 'Error!'; } return ( <Table items={data.entities} rowCount={data.count} onLoadMore={fetchMore}> <TableHeader> <TableHeaderCell value={({ item }) => item.name}> name </TableHeaderCell> <TableHeaderCell value={({ item }) => item.id}> entityGuid </TableHeaderCell> <TableHeaderCell value={({ item }) => item.accountId}> accountId </TableHeaderCell> </TableHeader> {({ item }) => ( <TableRow> <EntityTitleTableRowCell value={item} /> <TableRowCell>{item.guid}</TableRowCell> <TableRowCell>{item.accountId}</TableRowCell> </TableRow> )} </Table> ); }}</EntitiesByDomainTypeQuery>
Tableau à valeurs multiples
class Example extends React.Component { _getItems() { return [ { duration: 218, errorCount: 0, rootSpan: { startTimeMs: 1626773604851, entityName: 'log-patterns-training', guid: '5ef23490-54jklfsd09fsd-ef098lkj', name: 'Transactions/Group Log Patterns', }, totalSpanCount: 15, }, { duration: 110, errorCount: 2, rootSpan: { entityName: 'network-traicing', guid: '4gh2190490-098fsd0123d-ef098lkj', name: 'Other Transactions/Network', startTimeMs: 1626783604851, }, totalSpanCount: 7, }, { duration: 90, errorCount: 1, rootSpan: { entityName: 'staging-services.io', guid: 'tre2350490-312fsd0123d-ef098lkj', name: 'Staging Environment Transactions/Network', startTimeMs: 1626583604851, }, totalSpanCount: 12, }, ]; }
render() { return ( <Table items={this._getItems()} multivalue> <TableHeader> <TableHeaderCell width="30%">Trace group</TableHeaderCell> <TableHeaderCell width="30%">Root entity</TableHeaderCell> <TableHeaderCell alignmentType={TableHeaderCell.ALIGNMENT_TYPE.RIGHT}> Last start time </TableHeaderCell> <TableHeaderCell alignmentType={TableHeaderCell.ALIGNMENT_TYPE.RIGHT}> Trace duration </TableHeaderCell> </TableHeader>
{({ item }) => ( <TableRow> <TableRowCell additionalValue={`${item.errorCount} Errors, ${item.totalSpanCount} Spans`} > {item.rootSpan.name} </TableRowCell> <EntityTitleTableRowCell additionalValue={item.rootSpan.guid} value={{ name: item.rootSpan.entityName }} /> <MetricTableRowCell additionalValue={new Date( item.rootSpan.startTimeMs, ).toLocaleTimeString()} type={MetricTableRowCell.TYPE.TIMESTAMP} value={item.rootSpan.startTimeMs} /> <MetricTableRowCell type={MetricTableRowCell.TYPE.SECONDS} value={item.duration} /> </TableRow> )} </Table> ); }}
Accessoires
chaîne | Fournir une étiquette d'accessibilité qui décrit l'objectif du tableau, par exemple |
(nœud|fonction)[] | Contenu du tableau. La table ne peut contenir que comme enfants |
chaîne | Ajoute les noms de classe au composant. Doit être utilisé uniquement à des fins de positionnement et d'espacement. |
booléen | Détermine si le tableau doit être rendu en mode compact (le mode compact a des lignes plus étroites). En général, utilisez le mode standard, car le mode compact est réservé à la représentation des données, par exemple dans un dashboard. |
n'importe lequel[] | Les éléments à utiliser lors du rendu. Ils sont requis lors du rendu d'éléments avec un rappel de rendu. Chaque élément peut avoir n'importe quelle structure et n'importe quel type possible, et celui correspondant sera fourni lors du rendu de chaque liste d'éléments. |
nombre | Colonne contenant les données principales identifiant la ligne. Souvent, la première colonne (index 0) est celle qui convient, mais des actions (comme les favoris) peuvent être placées avant elle. |
booléen | Active une deuxième ligne de contenu pour la cellule qui prend en charge la propriété Remarque : le mode |
fonction | Rappel déclenché lorsque davantage d'éléments doivent être chargés. Cela se produit lorsque vous chargez les éléments de manière paresseuse et que les éléments sur le point d'être rendus ne peuvent pas être trouvés dans l'éventail function ( |
fonction | Fonction appelée lorsque l'utilisateur clique sur une case à cocher d'une ligne. Elle est appelée avec l'événement de la case à cocher, ainsi qu'avec un objet contenant l'élément représentant la ligne, son index dans l'éventail function ( |
nombre | Nombre de lignes. Par défaut, il est égal à la longueur de l'éventail passé dans la propriété items. Vous devez spécifier |
fonction | Fonction qui renvoie si une ligne est sélectionnée. Il doit renvoyer un booléen représentant l'état de la ligne. Il est appelé avec un objet contenant l'élément représentant la ligne, son index dans l'éventail function ( |
énum. | Définit le mode de sélection du
|
énumération[] | Propriété d'espacement. L'espacement est défini comme un uplet de zéro à quatre valeurs, qui suivent les mêmes conventions que les propriétés CSS comme <Array of |
objet | Style en ligne pour un style personnalisé. Doit être utilisé uniquement à des fins de positionnement et d'espacement. |
chaîne | Ajoute un attribut Remarque : vous ne verrez peut-être pas l'attribut |
Définitions de types
Cursor
{startIndex: number, First index of the range of items to load.
stopIndex: number, Last index of the range of items to load.
}
SelectedCallbackArgument
{item: any, Item to check.
index: number, Index of the item in the items array.
items: any[], Array of all items passed.
}