Bonjour, j'ai une application Angular qui affiche en temps réel l'état des processus en cours d'exécution dans un moteur de planification. J'ai le tableau suivant pour afficher ces processus:
Ce que je veux, c'est changer dynamiquement la couleur d'arrière-plan de la ligne en fonction de l'état, comme suit:
S (commencé) - Blanc;
W (en fonctionnement) - Bleu;
E (erreur) - Rouge;
F (fini) - Vert;
Html
<table mat-table [dataSource]="this.dataSource" multiTemplateDataRows class="mat-elevation-z8" >
<!--- Note that these columns can be defined in any order.
The actual rendered columns are set as a property on the row definition" -->
<ng-container matColumnDef="expandedDetail">
<td mat-cell *matCellDef="let element" [attr.colspan]="displayedColumns.length">
<div class="example-element-detail" [@detailExpand]="element == expandedElement ? 'expanded' : 'collapsed'" *ngIf="log_message">
<div class="example-element-description">
<p *ngIf="this.log_message">Log Message:</p>
<p *ngIf="!this.log_message">N/A</p>
<pre *ngIf="this.log_message"> {{ this.log_message }} </pre>
</div>
</div>
</td>
</ng-container>
<ng-container matColumnDef="UPD_DATE">
<th mat-header-cell *matHeaderCellDef> UPD_DATE </th>
<td mat-cell *matCellDef="let data"> {{data.LAST_UPD_DATETIME}} </td>
</ng-container>
<ng-container matColumnDef="S">
<th mat-header-cell *matHeaderCellDef> S </th>
<td mat-cell *matCellDef="let data"> {{data.STATUS}} </td>
</ng-container>
<ng-container matColumnDef="PROC">
<th mat-header-cell *matHeaderCellDef> PROC </th>
<td mat-cell *matCellDef="let data"> {{data.PROC_ID}} </td>
</ng-container>
<ng-container matColumnDef="AGENT">
<th mat-header-cell *matHeaderCellDef> AGENT </th>
<td mat-cell *matCellDef="let data"> {{data.AGENT_ID}} </td>
</ng-container>
<ng-container matColumnDef="SUBMIT_DATE">
<th mat-header-cell *matHeaderCellDef> SUBMIT_DATE </th>
<td mat-cell *matCellDef="let data"> {{data.SUBMIT_DATE}} </td>
</ng-container>
<ng-container matColumnDef="END_DATE">
<th mat-header-cell *matHeaderCellDef> END_DATE </th>
<td mat-cell *matCellDef="let data"> {{data.END_DATE}} </td>
</ng-container>
<ng-container matColumnDef="START_DATE">
<th mat-header-cell *matHeaderCellDef> START_DATE </th>
<td mat-cell *matCellDef="let data"> {{data.START_DATE}} </td>
</ng-container>
<ng-container matColumnDef="USER_SUBMIT">
<th mat-header-cell *matHeaderCellDef> USER_SUBMIT </th>
<td mat-cell *matCellDef="let data"> {{data.USER_SUBMIT}} </td>
</ng-container>
<ng-container matColumnDef="THREAD_NUM">
<th mat-header-cell *matHeaderCellDef> THREAD_NUM </th>
<td mat-cell *matCellDef="let data"> {{data.THREAD_NUM}} </td>
</ng-container>
<ng-container matColumnDef="INSTANCE_ID">
<th mat-header-cell *matHeaderCellDef> INSTANCE_ID </th>
<td mat-cell *matCellDef="let data"> {{data.INSTANCE_ID}} </td>
</ng-container>
<ng-container matColumnDef="START">
<th mat-header-cell *matHeaderCellDef> START </th>
<td mat-cell *matCellDef="let row"><button class="btn btn-success" (click)="onStart(row)" [disabled]="this.started">Start</button></td>
</ng-container>
<ng-container matColumnDef="STOP">
<th mat-header-cell *matHeaderCellDef> STOP </th>
<td mat-cell *matCellDef="let row"><button class="btn btn-danger" (click)="onStop()">Stop</button></td>
</ng-container>
<ng-container matColumnDef="LOG">
<th mat-header-cell *matHeaderCellDef> LOG </th>
<td mat-cell *matCellDef="let row"><button class="btn btn-info" (click)="onLog()">Log</button></td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
<tr mat-row *matRowDef="let element; columns: displayedColumns;" class="example-element-row"
[class.example-expanded-row]="expandedElement === element" (click)="log_message = onElementExpand(element); expandedElement = element;"></tr>
<tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="example-detail-row"></tr>
</table>
<mat-toolbar>
<mat-toolbar-row>
<button class="btn btn-primary" (click)="getIpeProcessInstances()" [disabled]="false">{{ 'button.Refresh' | translate }}</button>
<span class="example-spacer"></span>
<mat-paginator [pageSizeOptions]="[5, 10, 20]" showFirstLastButtons></mat-paginator>
</mat-toolbar-row>
</mat-toolbar>
[~ # ~] css [~ # ~]
table {
width: 100%;
}
tr.example-detail-row {
height: 0;
}
tr.example-element-row:not(.example-expanded-row):hover {
background: #f5f5f5;
}
tr.example-element-row:not(.example-expanded-row):active {
background: #efefef;
}
.example-element-row td {
border-bottom-width: 0;
}
.example-element-detail {
overflow: hidden;
display: flex;
}
.example-element-diagram {
min-width: 80px;
border: 2px solid black;
padding: 8px;
font-weight: lighter;
margin: 8px 0;
height: 104px;
}
.example-element-symbol {
font-weight: bold;
font-size: 40px;
line-height: normal;
}
.example-element-description {
padding: 16px;
}
.example-element-description-attribution {
opacity: 0.5;
}
.mat-elevation-z8 {
width: 100%;
}
.mat-row:hover {
background-color: whitesmoke;
}
.example-icon {
padding: 0 14px;
}
.example-spacer {
flex: 1 1 auto;
}
.mat-paginator
{
background-color: whitesmoke;
}
Donc, en fonction du statut déposé, comment puis-je changer la couleur de la ligne? Je vous remercie!
Vous pouvez aussi utiliser [ngClass]
pour y parvenir:
<td [ngClass]="{
'is-white': data.STATUS === 'S',
'is-blue': data.STATUS === 'W',
'is-red': data.STATUS === 'E',
'is-green': data.STATUS === 'F'
}">...</td>
Et puis dans votre css:
td.is-white {
background: ...;
}
Et voilà ! J'espère que cela aide à comprendre que vous pouvez y parvenir avec une solution différente.
MODIFIER
Pour votre usage, utilisez simplement le [ngClass]
dans la seconde <tr>
<tr mat-row *matRowDef="let element; columns: displayedColumns;" class="example-element-row"
[class.example-expanded-row]="expandedElement === element"
[ngClass]="{
'is-white': element.STATUS === 'S',
'is-blue': element.STATUS === 'W',
'is-red': element.STATUS === 'E',
'is-green': element.STATUS === 'F'
}" (click)="log_message = onElementExpand(element); expandedElement = element;"></tr>
Vous pouvez y parvenir en utilisant [ngStyle]
sur
<td mat-cell *matCellDef="let data" [ngStyle]="{'background-color': data.STATUS == 's' ? 'white': data.STATUS == 'w' ? 'blue' : data.STATUS == 'e' ? 'Red' : data.STATUS == 'f' ? 'green' : ''}"> {{data.STATUS}} </td>
et ma réponse n'est pas parfaite car dans ce cas, vous devez répéter [ngStyle]
sur chaque td
Ajoutez l'attribut avec la valeur d'un état, puis écrivez CSS pour cet attribut
par exemple: HTML
<tr [attr.row_status]="data.STATUS" /></tr>
Ainsi, lorsque la vue sera rendue, votre code HTML ressemblera à ceci:
<tr row_status="S"></tr>
Maintenant, ajoutez CSS pour le sélecteur:
[row_status="S"] {
background: #fff
}
faites-moi savoir si vous rencontrez toujours le problème. Et éventuellement partager le code la prochaine fois via l'extrait de code.
À votre santé :)