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>&nbsp;~ : 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>&nbsp;~ : 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