From faeabcca7a48349a2923bcac6581cbd15d9d8ad0 Mon Sep 17 00:00:00 2001 From: Alex ORLUC <alex.orluc@maarch.org> Date: Mon, 19 Oct 2020 12:20:52 +0200 Subject: [PATCH] FEAT #13268 TIME 1 WIP admin connections --- .../connections-administration.component.html | 61 +++++++++++++++- .../connections-administration.component.scss | 7 ++ .../connections-administration.component.ts | 72 ++++++++++++++++++- src/lang/lang-fr.json | 41 +++++------ 4 files changed, 159 insertions(+), 22 deletions(-) diff --git a/src/frontend/app/administration/connection/connections-administration.component.html b/src/frontend/app/administration/connection/connections-administration.component.html index e0dd21498a4..906fd4e64e0 100644 --- a/src/frontend/app/administration/connection/connections-administration.component.html +++ b/src/frontend/app/administration/connection/connections-administration.component.html @@ -9,6 +9,15 @@ </p> </a> </mat-nav-list> + <mat-divider></mat-divider> + <mat-nav-list> + <a mat-list-item *ngFor="let menu of subMenus" [class.active]="menu.current" [routerLink]="menu.route"> + <mat-icon color="primary" mat-list-icon [class]="menu.icon"></mat-icon> + <p mat-line> + {{menu.label}} + </p> + </a> + </mat-nav-list> </ng-template> <mat-sidenav-content> <div class="bg-head"> @@ -29,7 +38,57 @@ <mat-spinner style="margin:auto;"></mat-spinner> </div> <mat-card *ngIf="!loading" class="card-app-content"> - + <div class="row"> + <div class="col-md-6 col-xs-6"> + <mat-form-field> + <input matInput [formControl]="adminService.getFilterField()" placeholder="{{'lang.filterBy' | translate}}"> + </mat-form-field> + </div> + <div class="col-md-6 col-xs-6"> + <mat-paginator #paginator [length]="100" [hidePageSize]="true" [pageSize]="10"> + </mat-paginator> + </div> + </div> + <mat-table #table [dataSource]="adminService.getDataSource()" matSortDisableClear matSort> + <ng-container matColumnDef="id"> + <mat-header-cell *matHeaderCellDef mat-sort-header + [class.hide-for-mobile]="appService.getViewMode()" style="flex:2;">{{'lang.id' | translate}} + </mat-header-cell> + <mat-cell *matCellDef="let element" [class.hide-for-mobile]="appService.getViewMode()" + style="flex:2;">{{element.id}}</mat-cell> + </ng-container> + <ng-container matColumnDef="label"> + <mat-header-cell *matHeaderCellDef mat-sort-header style="flex:2;">{{'lang.description' | translate}} + </mat-header-cell> + <mat-cell *matCellDef="let element" style="flex:2;"> {{element.label}} </mat-cell> + </ng-container> + <ng-container matColumnDef="actions"> + <mat-header-cell *matHeaderCellDef></mat-header-cell> + <mat-cell *matCellDef="let element" style="justify-content: flex-end;"> + <button mat-icon-button color="primary" + *ngIf="element.enabled" [title]="'lang.suspend' | translate" + (click)="$event.stopPropagation();toggleConnection(element, false)"> + <mat-icon class="fa fa-pause fa-2x" aria-hidden="true"></mat-icon> + </button> + <button mat-icon-button color="accent" *ngIf="!element.enabled" + [title]="'lang.authorize' | translate" + (click)="$event.stopPropagation();toggleConnection(element, true)"> + <mat-icon class="fa fa-check fa-2x" aria-hidden="true"></mat-icon> + </button> + <button mat-icon-button color="warn" matTooltip="{{'lang.delete' | translate}}" + (click)="$event.stopPropagation();delete(element)"> + <mat-icon class="fa fa-trash-alt fa-2x" aria-hidden="true"></mat-icon> + </button> + </mat-cell> + </ng-container> + <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row> + <mat-row *matRowDef="let row; columns: displayedColumns;" + routerLink="/administration/sso/{{row.id}}" style="cursor:pointer;" + matTooltip="{{'lang.view' | translate}}"></mat-row> + </mat-table> + <div class="mat-paginator" + style="min-height:48px;min-height: 48px;display: flex;justify-content: end;align-items: center;padding-right: 20px;"> + {{connections.length}} {{'lang.ssoConnections' | translate}}</div> </mat-card> </div> </div> diff --git a/src/frontend/app/administration/connection/connections-administration.component.scss b/src/frontend/app/administration/connection/connections-administration.component.scss index e69de29bb2d..134cfc86a6c 100644 --- a/src/frontend/app/administration/connection/connections-administration.component.scss +++ b/src/frontend/app/administration/connection/connections-administration.component.scss @@ -0,0 +1,7 @@ +@import '../../../css/vars.scss'; + +.active, .active:hover , .active:active, .active:focus { + color: $primary; + border-left: solid 5px $primary; + background: rgba($primary, 0.14); +} \ No newline at end of file diff --git a/src/frontend/app/administration/connection/connections-administration.component.ts b/src/frontend/app/administration/connection/connections-administration.component.ts index f5e317b0060..39f7aa1a3bb 100644 --- a/src/frontend/app/administration/connection/connections-administration.component.ts +++ b/src/frontend/app/administration/connection/connections-administration.component.ts @@ -1,5 +1,14 @@ -import { Component, OnInit } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Component, OnInit, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core'; +import { MatPaginator } from '@angular/material/paginator'; +import { MatSort } from '@angular/material/sort'; +import { TranslateService } from '@ngx-translate/core'; import { AppService } from '@service/app.service'; +import { HeaderService } from '@service/header.service'; +import { NotificationService } from '@service/notification/notification.service'; +import { of } from 'rxjs'; +import { catchError, tap } from 'rxjs/operators'; +import { AdministrationService } from '../administration.service'; @Component({ selector: 'app-connections-administration', @@ -10,11 +19,72 @@ export class ConnectionsAdministrationComponent implements OnInit { loading: boolean = true; + @ViewChild('adminMenuTemplate', { static: true }) adminMenuTemplate: TemplateRef<any>; + @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator; + @ViewChild(MatSort, { static: false }) sort: MatSort; + + subMenus: any[] = [ + { + icon: 'fas fa-users-cog', + route: '/administration/sso', + label: this.translate.instant('lang.sso'), + current: true + } + ]; + + displayedColumns = ['id', 'label', 'actions']; + filterColumns = ['id', 'label']; + + connections: any[] = []; + constructor( + public translate: TranslateService, + public http: HttpClient, + private notify: NotificationService, public appService: AppService, + private headerService: HeaderService, + private viewContainerRef: ViewContainerRef, + public adminService: AdministrationService, ) { } ngOnInit(): void { + this.headerService.injectInSideBarLeft(this.adminMenuTemplate, this.viewContainerRef, 'adminMenu'); + this.headerService.setHeader(this.translate.instant('lang.administration') + ' ' + this.translate.instant('lang.ssoConnections')); + this.getConnections(); + } + + getConnections() { + // FOR TEST + this.connections = [ + { + id: 1, + label: 'Connexion SSO', + enabled: true + }, + { + id: 1, + label: 'Connexion SSO2', + enabled: false + } + ]; + this.loading = false; + setTimeout(() => { + this.adminService.setDataSource('admin_groups', this.connections, this.sort, this.paginator, this.filterColumns); + }, 0); + + /* this.http.get('../rest/???').pipe( + tap((data: any) => { + this.connections = data; + this.loading = false; + setTimeout(() => { + this.adminService.setDataSource('admin_groups', this.connections, this.sort, this.paginator, this.filterColumns); + }, 0); + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); + }) + ).subscribe(); */ } } diff --git a/src/lang/lang-fr.json b/src/lang/lang-fr.json index edea8ef73bc..ea7001d01f9 100644 --- a/src/lang/lang-fr.json +++ b/src/lang/lang-fr.json @@ -1883,8 +1883,8 @@ "usersExport": "Exporter des utilisateurs", "usersOfFile": "Utilisateurs du fichier", "previewed": "Prévisualisés", - "additions" : "Ajouts", - "modifications" : "Modifications", + "additions": "Ajouts", + "modifications": "Modifications", "dndFileCsvDesc": "Cliquez ici ou glissez-déposez un fichier csv", "dbColumn": "Colonne base de données", "csvColumn": "Colonne fichier csv", @@ -2032,8 +2032,8 @@ "addSearchTemplateMsg": "Ce modèle sera privé. Tous les critères et valeurs sélectionnés seront enregistrés", "mySearchTemplates": "Mes modèles", "searchTemplateDeleted": "Modèle de recherche supprimé", - "searchAdministration" : "Administration recherche", - "contactInput" : "Champ contact", + "searchAdministration": "Administration recherche", + "contactInput": "Champ contact", "issuingSiteSample": "MAARCH - Nanterre", "registeredMailReferenceSample": "01/01/2020 - Ma référence", "registeredMailRecipientSample": "MAARCH-LES-BAINS PATRICIA PETIT", @@ -2048,13 +2048,13 @@ "start": "Début", "end": "Fin", "createSearchTemplate": "Enregistrer un modèle...", - "infoImportregisteredMails" : "Les fichiers <b>sans en-tête</b> sont organisés en fonction des <b>positions des colonnes</b> du fichier.<br/>Les valeurs <b>par défaut</b> définies dans le <b>modèle d'enregistrement</b> sont prises en compte.", - "searchInAttachmentsInfo" : "Indique que la recherche se fait sur les courriers et les pièces jointes.", + "infoImportregisteredMails": "Les fichiers <b>sans en-tête</b> sont organisés en fonction des <b>positions des colonnes</b> du fichier.<br/>Les valeurs <b>par défaut</b> définies dans le <b>modèle d'enregistrement</b> sont prises en compte.", + "searchInAttachmentsInfo": "Indique que la recherche se fait sur les courriers et les pièces jointes.", "fulltext": "Plein texte", - "searchFulltextInfo" : "\" \" : Pour effectuer une recherche sur un groupe de mots (\"route nationale\" trouve l'expression entière route nationale)<br> ~ : Pour effectuer une recherche approximative (vite~ trouve vote, vite)", - "criteriaOverQuickSearch" : "Les critères de recherche se cumulent sur la recherche rapide", - "manualSearchInfo" : "Vous pouvez laisser le terme dans le champ sans sélectionner de valeur pour la recherche.", - "groupSign" : "Groupe du signataire", + "searchFulltextInfo": "\" \" : Pour effectuer une recherche sur un groupe de mots (\"route nationale\" trouve l'expression entière route nationale)<br> ~ : Pour effectuer une recherche approximative (vite~ trouve vote, vite)", + "criteriaOverQuickSearch": "Les critères de recherche se cumulent sur la recherche rapide", + "manualSearchInfo": "Vous pouvez laisser le terme dans le champ sans sélectionner de valeur pour la recherche.", + "groupSign": "Groupe du signataire", "noAdminSearchConfiguration": "Aucune configuration de recherche trouvée", "producerService": "Identifiant de service producteur", "sendersDepartment": "Département des expéditeurs", @@ -2093,13 +2093,14 @@ "ldapEnabled": "Ldap activé", "keycloakEnabled": "Authentification Keycloak activée", "casEnabled": "Authentification CAS activée", - "displayAsTechnicalData" : "Afficher en tant que donnée technique", - "displayInForm" : "Afficher dans le formulaire", - "formDescription" : "Permet d'utiliser ce champs dans les modèle d'enregistrement", - "technicalInformations" : "Informations techniques", - "technicalDescription" : "Ce type est persistant et n'as pas besoin d'être associé à un modèle d'enregistrement", - "displayMode" :"Mode d'affichage", - "connections" :"Connexions", - "connectionsDesc" :"Administrer les modes de connexion de l'application" - -} + "displayAsTechnicalData": "Afficher en tant que donnée technique", + "displayInForm": "Afficher dans le formulaire", + "formDescription": "Permet d'utiliser ce champs dans les modèle d'enregistrement", + "technicalInformations": "Informations techniques", + "technicalDescription": "Ce type est persistant et n'as pas besoin d'être associé à un modèle d'enregistrement", + "displayMode": "Mode d'affichage", + "connections": "Connexions", + "connectionsDesc": "Administrer les modes de connexion de l'application", + "ssoConnections": "Connexions SSO", + "sso": "SSO" +} \ No newline at end of file -- GitLab