From 29d1314805bb52fdb00ecd0219b4cbef81020378 Mon Sep 17 00:00:00 2001 From: jboinembalome Date: Fri, 19 Feb 2021 09:47:14 +0100 Subject: [PATCH] Creation du composant FormationsTableComponent --- .../formations-table/formations.table.css | 0 .../formations-table/formations.table.html | 84 ++++++ .../formations-table/formations.table.ts | 260 ++++++++++++++++++ .../shared/mat-tables/mat-tables.module.ts | 15 +- 4 files changed, 356 insertions(+), 3 deletions(-) create mode 100644 src/app/shared/mat-tables/formations-table/formations.table.css create mode 100644 src/app/shared/mat-tables/formations-table/formations.table.html create mode 100644 src/app/shared/mat-tables/formations-table/formations.table.ts diff --git a/src/app/shared/mat-tables/formations-table/formations.table.css b/src/app/shared/mat-tables/formations-table/formations.table.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/shared/mat-tables/formations-table/formations.table.html b/src/app/shared/mat-tables/formations-table/formations.table.html new file mode 100644 index 0000000..ce58390 --- /dev/null +++ b/src/app/shared/mat-tables/formations-table/formations.table.html @@ -0,0 +1,84 @@ + + + + + + + + + + Rechercher une formation + + + + + + + + + + + + + Intitulé + {{ row.intitule }} + + + + Nb participants + {{ row.nbParticipations }} + + + + Date prévisionnelle + {{ row.dateDebut | date:'dd/MM/yyyy à hh:mm' }} + + + + Origine + {{row.origine.libelle}} + + + + + Statut + + + + {{row.statut.libelle}} + + + + Certifiée + {{estCertifiee(row.estCertifiee)}} + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/shared/mat-tables/formations-table/formations.table.ts b/src/app/shared/mat-tables/formations-table/formations.table.ts new file mode 100644 index 0000000..397b582 --- /dev/null +++ b/src/app/shared/mat-tables/formations-table/formations.table.ts @@ -0,0 +1,260 @@ +import { Component, Input, OnInit } from "@angular/core"; + +import { Subscription } from 'rxjs'; + +import {MatTableDataSource} from '@angular/material/table'; + +import { CollaborateurDTO, FormationDetailsDTO, StatutFormationDTO } from '@shared/api-swagger/model/models' +import { FormationsService } from "@shared/api-swagger/api/api"; +import { cles } from "@shared/utils/cles"; + + +@Component({ + selector: "formations-table", + templateUrl: "./formations.table.html", + styleUrls: ["./formations.table.css"] +}) +export class FormationsTableComponent implements OnInit { + + /** + * Ordre de tri à envoyer au serveur (true : croissant, false : décroissantà). + */ + asc : boolean = true; + + /** + * Numéro de la page à afficher dans le tableau. + */ + numPage: number = 1; + /** + * Nombre d'élément du tableau à affiche en une page. + */ + parPage: number = 15; + /** + * Observable pour faire des requêtes sur le service formation. + */ + private formationsDisponiblesSubscription : Subscription; + + /** + * Observable pour faire des requêtes sur le service formation. + */ + private formationsDisponiblesCountSubscription : Subscription; + + /** + * C'est dans cet objet que seront stockés les formations à afficher dans le Mat Table côté template. + */ + dataSource : MatTableDataSource; + + /** + * contenu de la recherche pour trouver une formation. + */ + search: string = ""; + /** + * Permet de savoir sur quelle attribut d'un FormationDetailsDTO doit être trié le tableau. + */ + tri: string = "intitule"; + + /** + * Id agence collaborateur connecté + */ + idAgence: number; + + /** + * Liste des statuts de formation + */ + statutsFormation: Array = []; + + /** + * Liste des id statuts à afficher + */ + private idStatuts: Array = []; + + /** + * Spécifie si les checkbox des statuts de formation sont toutes cochées ou non. + */ + isStatutsSelectedAll: boolean = false; + + /** + * Nombre total d'élément du tableau + */ + taille: number = 0; + + /** + * Options pour choisir le nombre de page à affiche + */ + pageOption = [ 5, 15, 20, 30, 50]; + + /** + * Spécifie si la liste des formations est en cours de chargement dans le tableau. + */ + chargement: boolean = true; + + /** + * Indique si la recherche par statut de formation est activée ou non + */ + @Input() rechercherParStatutFormation: boolean = false; + + /** + * Liste des colonnes du tableau à afficher. + */ + @Input() displayedColumns : string[]; + + private collaborateurConnecte : CollaborateurDTO; + + constructor(private formationsService: FormationsService) {} + + ngOnInit() { + this.getStatutsFormation(); + this.setCollaborateurConnecte(); + } + + /** + * Mettre à jour les informations à afficher dans la tableau. + * Devra se faire à l'ouverture de la page, au changement de page ou du nombre d'éléments à afficher, au moment d'un tri ou encore lors de l'utilisation de la barre de recherche. + */ + updateDataSource() { + this.updateFormations(); + } + + /** + * Récupère les statuts de formation + */ + getStatutsFormation() + { + this.formationsService.getStatutsFormation().subscribe( + statuts => { + this.statutsFormation = statuts; + // statuts.map(statut => this.idStatuts.push(statut.id)); + + }, + err => console.log(err) + ); + } + + /** + * Mettre à jour les informations à afficher dans la tableau. + * Devra se faire à l'ouverture de la page, au changement de page ou du nombre d'éléments à afficher, au moment d'un tri ou encore lors de l'utilisation de la barre de recherche. + */ + updateFormations() { + this.formationsDisponiblesSubscription = this.formationsService.getFormations(this.idAgence,this.idStatuts,this.asc, this.numPage, this.parPage, this.search, this.tri).subscribe( + formations => this.dataSource = new MatTableDataSource(formations), + err => console.log(err) + ) + + this.formationsDisponiblesCountSubscription = this.formationsService.getFormationsCount(this.idAgence,this.idStatuts,this.asc, this.numPage, this.parPage, this.search, this.tri).subscribe( + count => { console.log(count); this.taille=count;}, + err => console.log(err) + ); + } + + estCertifiee(certifiee: boolean) { + if(certifiee) + return "Oui"; + return "Non"; + } + + setCollaborateurConnecte() + { + if(sessionStorage.getItem(cles.sessionKeyConnectee) == undefined){ + setTimeout( () => this.setCollaborateurConnecte(), 1000); + } + else { + this.collaborateurConnecte = JSON.parse(sessionStorage.getItem(cles.sessionKeyConnectee)); + this.idAgence = this.collaborateurConnecte.businessUnit.agence.id; + this.updateDataSource(); + this.chargement = false; + } + } + + /** + * Mettre à jour le nomre d'élément à afficher par page et le numéro de la page + * @param event évènement de la pagination + */ + updatePageInfo(event){ + this.parPage = event.pageSize; + this.numPage = event.pageIndex+1; + this.updateDataSource(); + } + + + /** + * Remettre au début la liste lors d'une recherche via la barre de recherche + */ + setSearch() { + this.numPage = 1; + this.updateDataSource(); + } + + + /** + * Vider la barre de recherche et remettre le tableau à la première page + */ + resetSearch() { + this.search = ""; + this.setSearch(); + } + + + /** + * Trier le tableau en fonction de l'évènement de la colonne + * @param e évènement du tri + */ + triTableau(e) { + this.tri = e.active; + switch(e.direction) { + case "asc": + this.asc = true; + break; + case "desc": + this.asc = false; + break; + } + this.updateDataSource(); + } + + /** + * Mettre à jour toutes les checkox + * @param event case cochée ou décochée + */ + updateAllCheckbox(event) { + this.idStatuts = []; + // si la checkbox a été cochée + if(event) + this.statutsFormation.map(statut => this.idStatuts.push(statut.id)); + else + this.idStatuts = []; + + this.numPage = 1; + this.updateDataSource(); + } + + + /** + * Mettre à jour la liste des checkox + * @param event case cochée ou décochée + * @param statut statut concerné par la checkbox cochée ou décochée + */ + updateCheckbox(event, statut) { + // si la checkbox a été cochée + if(event) { + this.idStatuts.push(statut.id) + } + else{ + this.idStatuts = this.idStatuts.filter(id => id != statut.id); + } + this.numPage = 1; + this.updateDataSource(); + } + + /** + * Une fois la page fermée, il est nécessaire de se désabonner des Oberservable afin d'éviter les fuites mémoires. + */ + ngOnDestroy() { + if(this.formationsDisponiblesSubscription != undefined) { + this.formationsDisponiblesSubscription.unsubscribe(); + } + if(this.formationsDisponiblesCountSubscription != undefined) { + this.formationsDisponiblesCountSubscription.unsubscribe(); + } + } + } + \ No newline at end of file diff --git a/src/app/shared/mat-tables/mat-tables.module.ts b/src/app/shared/mat-tables/mat-tables.module.ts index 8d18aa8..0b823ca 100644 --- a/src/app/shared/mat-tables/mat-tables.module.ts +++ b/src/app/shared/mat-tables/mat-tables.module.ts @@ -1,20 +1,29 @@ import { NgModule } from "@angular/core"; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; +import { RouterModule } from '@angular/router'; import { MaterialModule } from "../angular-material/angular-material.module"; import { CollaborateursTableComponent } from "@shared/mat-tables/collaborateurs-table/collaborateurs.table"; +import { FormationsTableComponent } from "@shared/mat-tables/formations-table/formations.table"; +import { FilterModule } from "@shared/filter/filter.module"; @NgModule({ declarations: [ - CollaborateursTableComponent + CollaborateursTableComponent, + FormationsTableComponent ], imports: [ MaterialModule, + FilterModule, CommonModule, - FormsModule + FormsModule, + RouterModule ], - exports: [CollaborateursTableComponent] + exports: [ + CollaborateursTableComponent, + FormationsTableComponent + ] }) export class MatTablesModule {}