Reputation: 278
I have a data table, with a button that opens a Modal (Bootstrap Modal) for each table row.
I would like that when I open a one row modal, I get the data from that row.
it works with "console.log (this.array[index])"
. And also when I open the Modal, it always shows me the data of the first row of the table.
I think I'm missing an index parameter in the modal.
Thank you in advance for your help.
My TS File :
export class ListeDevisComponent implements OnInit {
listeDevis = [];
constructor(private listeDevisService: ListeDevisService) {}
ngOnInit() {
this.listeDevisService.getListeDevis().subscribe(
(data: any) => {
this.listeDevis = data;
},
(error) => {
console.error(error);
},
() => {
console.log("Liste Devis Success");
}
);
}
voirIndexDevis(index) {
console.log(this.listeDevis[index]);
}
}
My HTML File :
<table class="table">
<thead class="thead-dark">
<tr>
<th scope="col">ID Devis</th>
<th scope="col">Date Devis</th>
<th scope="col">Actions</th>
<th scope="col">Nom Complet</th>
<th scope="col">Contact</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let liste of listeDevis; let i = index">
<td>{{ liste.idDevis }}</td>
<td>{{ liste.dateDevis }}</td>
<td>
<button
class="btn btn-primary"
data-toggle="modal"
data-target="#exampleModal"
(click)="voirIndexDevis(i)"
>
Test Modal Actions
</button>
</td>
<td>{{ liste.nom }} {{ liste.prenom }}</td>
<td>{{ liste.email }}</td>
</tr>
</tbody>
</table>
<!-- Modal -->
<div
class="modal fade"
id="exampleModal"
tabindex="-1"
aria-labelledby="exampleModalLabel"
aria-hidden="true"
>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Liste Devis</h5>
<button
type="button"
class="close"
data-dismiss="modal"
aria-label="Close"
>
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="row" *ngFor="let liste of listeDevis; let i = index">
<div class="col-lg-3 col-12 border">
<h5>Type Installation :</h5>
{{ liste.typeInstallation }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Quantité :</h5>
{{ liste.qte }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Charge Nominale :</h5>
{{ liste.charge }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Nombres Arrêts :</h5>
{{ liste.arrets }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Type Gaine :</h5>
{{ liste.typeGaine }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Local Machinerie :</h5>
{{ liste.localMachinerie }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Mode Entrainement :</h5>
{{ liste.modeEntrainement }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Modèle :</h5>
{{ liste.modeles }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Couleur :</h5>
{{ liste.couleur }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Dimension Cabine :</h5>
{{ liste.dimensionCabine }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Plafond :</h5>
{{ liste.plafond }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Mirroir :</h5>
{{ liste.mirroir }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Porte Cabine :</h5>
{{ liste.porteCabine }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Accessoires :</h5>
{{ liste.accessoires }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Type Porte Paliers :</h5>
{{ liste.typePortePaliers }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Ouverture :</h5>
{{ liste.ouverture }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Passage Libre :</h5>
{{ liste.passageLibre }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Finition :</h5>
{{ liste.finition }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Votre Nom :</h5>
{{ liste.nom }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Votre Prenom :</h5>
{{ liste.prenom }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Destinataire :</h5>
{{ liste.destinataire }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Votre E-mail :</h5>
{{ liste.email }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Votre Numéro Tel :</h5>
{{ liste.telephone }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Votre Disponibilité :</h5>
{{ liste.disponibilite }}
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">
Fermer
</button>
</div>
</div>
</div>
</div>
Upvotes: 0
Views: 1298
Reputation: 523
To get the row data, pass liste
instead of i
:
(click)="voirIndexDevis(liste)"
Then, set the current list item in the component file:
export class ListeDevisComponent implements OnInit {
listeDevis = [];
currentListe;
constructor(private listeDevisService: ListeDevisService) {}
// ngOnInit removed for brevity
voirIndexDevis(liste) {
this.currentListe = liste;
}
}
Then adjust the modal, removing the *ngFor
and adding the safe navigation operator to each instance of currentListe.prop
:
<!-- Modal -->
<div
class="modal fade"
id="exampleModal"
tabindex="-1"
aria-labelledby="exampleModalLabel"
aria-hidden="true"
>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Liste Devis</h5>
<button
type="button"
class="close"
data-dismiss="modal"
aria-label="Close"
>
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="row">
<div class="col-lg-3 col-12 border">
<h5>Type Installation :</h5>
{{ currentListe?.typeInstallation }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Quantité :</h5>
{{ currentListe?.qte }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Charge Nominale :</h5>
{{ currentListe?.charge }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Nombres Arrêts :</h5>
{{ currentListe?.arrets }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Type Gaine :</h5>
{{ currentListe?.typeGaine }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Local Machinerie :</h5>
{{ currentListe?.localMachinerie }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Mode Entrainement :</h5>
{{ currentListe?.modeEntrainement }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Modèle :</h5>
{{ currentListe?.modeles }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Couleur :</h5>
{{ currentListe?.couleur }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Dimension Cabine :</h5>
{{ currentListe?.dimensionCabine }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Plafond :</h5>
{{ currentListe?.plafond }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Mirroir :</h5>
{{ currentListe?.mirroir }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Porte Cabine :</h5>
{{ currentListe?.porteCabine }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Accessoires :</h5>
{{ currentListe?.accessoires }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Type Porte Paliers :</h5>
{{ currentListe?.typePortePaliers }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Ouverture :</h5>
{{ currentListe?.ouverture }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Passage Libre :</h5>
{{ currentListe?.passageLibre }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Finition :</h5>
{{ currentListe?.finition }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Votre Nom :</h5>
{{ currentListe?.nom }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Votre Prenom :</h5>
{{ currentListe?.prenom }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Destinataire :</h5>
{{ currentListe?.destinataire }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Votre E-mail :</h5>
{{ currentListe?.email }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Votre Numéro Tel :</h5>
{{ currentListe?.telephone }}
</div>
<div class="col-lg-3 col-12 border">
<h5>Votre Disponibilité :</h5>
{{ currentListe?.disponibilite }}
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">
Fermer
</button>
</div>
</div>
</div>
</div>
If the safe navigation operator (currentListe?.prop
) does not work, you could also use an ngIf:
<div class="row" *ngIf="currentListe">
<!-- row data -->
</div>
Because we all love options, you can also control the modal manually. First, remove the logic that connects the row buttons to the modal:
<button
class="btn btn-primary"
(click)="voirIndexDevis(liste)"
>
Test Modal Actions
</button>
Then add logic to the component file to show/hide the modal:
export class ListeDevisComponent implements OnInit {
listeDevis = [];
currentListe;
showModal: boolean = false;
constructor(private listeDevisService: ListeDevisService) {}
// ngOnInit removed for brevity
voirIndexDevis(liste) {
this.currentListe = liste;
this.showModal = true;
}
hideModal() {
this.showModal = false;
}
}
Then update the modal show/hide logic by adding an *ngIf
to the outer div
and updating the close button in the upper-right corner and the footer button to call hideModal()
when clicked:
<div
*ngIf="showModal"
class="modal fade"
id="exampleModal"
tabindex="-1"
aria-labelledby="exampleModalLabel"
aria-hidden="true"
>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Liste Devis</h5>
<button
type="button"
class="close"
onclick="hideModal()"
aria-label="Close"
>
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<!-- hide modal body for brevity -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" onclick="hideModal()">
Fermer
</button>
</div>
</div>
</div>
</div>
Upvotes: 3
Reputation: 54
At the voirIndexDevis
function you have to do the same event into the service file but this time only receive the listeDevis
with the index you sent. But i advise you to create a new variable like Devis
and paste the data from that event so that variable only contain the one that you click.
Upvotes: 0