From 1d34796579ef7088f4eeda31785c5b562956299c Mon Sep 17 00:00:00 2001
From: Bastien DUMONT <bdumont@grandlyon.com>
Date: Wed, 5 Apr 2023 08:30:28 +0000
Subject: [PATCH] feat(admin): show deleted structures

---
 src/app/admin/admin.module.ts                 |  2 +
 .../deleted-structures.component.html         | 15 +++++
 .../deleted-structures.component.scss         |  7 +++
 .../deleted-structures.component.ts           | 57 +++++++++++++++++++
 .../components/panel/panel.component.html     | 37 ++++++------
 .../admin/components/panel/panel.component.ts | 16 ++----
 src/app/admin/services/admin.service.ts       |  5 ++
 src/app/models/structure.model.ts             |  2 +
 src/app/shared/enum/adminPanel.enum.ts        |  7 ++-
 .../structure-details.component.html          |  9 ++-
 10 files changed, 123 insertions(+), 34 deletions(-)
 create mode 100644 src/app/admin/components/deleted-structures/deleted-structures.component.html
 create mode 100644 src/app/admin/components/deleted-structures/deleted-structures.component.scss
 create mode 100644 src/app/admin/components/deleted-structures/deleted-structures.component.ts

diff --git a/src/app/admin/admin.module.ts b/src/app/admin/admin.module.ts
index c0b63004e..22525977d 100644
--- a/src/app/admin/admin.module.ts
+++ b/src/app/admin/admin.module.ts
@@ -20,6 +20,7 @@ import { JobRendererComponent } from './components/manage-users/job-renderer/job
 import { ManageUsersComponent } from './components/manage-users/manage-users.component';
 import { PanelComponent } from './components/panel/panel.component';
 import { AdminStructuresListComponent } from './components/structures-list/admin-structures-list.component';
+import { DeletedStructuresComponent } from './components/deleted-structures/deleted-structures.component';
 
 @NgModule({
   declarations: [
@@ -40,6 +41,7 @@ import { AdminStructuresListComponent } from './components/structures-list/admin
     AttachedUsersComponent,
     ManageJobsComponent,
     ManageEmployersComponent,
+    DeletedStructuresComponent,
   ],
   imports: [CommonModule, AdminRoutingModule, SharedModule, AgGridModule],
 })
diff --git a/src/app/admin/components/deleted-structures/deleted-structures.component.html b/src/app/admin/components/deleted-structures/deleted-structures.component.html
new file mode 100644
index 000000000..ef140d887
--- /dev/null
+++ b/src/app/admin/components/deleted-structures/deleted-structures.component.html
@@ -0,0 +1,15 @@
+<div *ngIf="isLoading" class="loader">
+  <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt />
+</div>
+<div *ngIf="!isLoading" class="deletedStructures">
+  <h2>Liste des structures supprimées</h2>
+
+  <ag-grid-angular
+    *ngIf="deletedStructures"
+    class="ag-theme-alpine"
+    domLayout="autoHeight"
+    style="width: 100%"
+    [rowData]="deletedStructures"
+    [columnDefs]="columnDefs"
+  />
+</div>
diff --git a/src/app/admin/components/deleted-structures/deleted-structures.component.scss b/src/app/admin/components/deleted-structures/deleted-structures.component.scss
new file mode 100644
index 000000000..74e60b461
--- /dev/null
+++ b/src/app/admin/components/deleted-structures/deleted-structures.component.scss
@@ -0,0 +1,7 @@
+.deletedStructures {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  margin: auto;
+  width: 80%;
+}
diff --git a/src/app/admin/components/deleted-structures/deleted-structures.component.ts b/src/app/admin/components/deleted-structures/deleted-structures.component.ts
new file mode 100644
index 000000000..6b48ced90
--- /dev/null
+++ b/src/app/admin/components/deleted-structures/deleted-structures.component.ts
@@ -0,0 +1,57 @@
+import { DatePipe } from '@angular/common';
+import { Component, OnInit } from '@angular/core';
+import { ColDef } from 'ag-grid-community';
+import { finalize } from 'rxjs/operators';
+import { Structure } from '../../../models/structure.model';
+import { AdminService } from '../../services/admin.service';
+
+@Component({
+  selector: 'app-deleted-structures',
+  templateUrl: './deleted-structures.component.html',
+  styleUrls: ['./deleted-structures.component.scss'],
+})
+export class DeletedStructuresComponent implements OnInit {
+  public deletedStructures: Structure[];
+  public selectedStructure: Structure;
+  public isLoading = true;
+
+  constructor(private adminService: AdminService, private datePipe: DatePipe) {}
+
+  ngOnInit(): void {
+    this.adminService
+      .getDeletedStructures()
+      .pipe(finalize(() => (this.isLoading = false)))
+      .subscribe((structures) => {
+        this.deletedStructures = structures;
+      });
+  }
+
+  private renderLink(structure: Structure) {
+    return `<a href="/acteurs?id=${structure._id}" target="_blank">${structure.structureName}</a>`;
+  }
+
+  public columnDefs: ColDef<Structure>[] = [
+    {
+      headerName: 'Structure',
+      field: 'structureName',
+      minWidth: 450,
+      sortable: true,
+      cellRenderer: (params) => this.renderLink(params.data),
+    },
+    {
+      headerName: 'Date de création',
+      field: 'createdAt',
+      width: 190,
+      sortable: true,
+      valueFormatter: (params) => this.datePipe.transform(params.value, 'yyyy-MM-dd'),
+    },
+    {
+      headerName: 'Date de suppression',
+      field: 'deletedAt',
+      width: 190,
+      sortable: true,
+      sort: 'desc',
+      valueFormatter: (params) => this.datePipe.transform(params.value, 'yyyy-MM-dd'),
+    },
+  ];
+}
diff --git a/src/app/admin/components/panel/panel.component.html b/src/app/admin/components/panel/panel.component.html
index 56cf05e40..4afbd9a95 100644
--- a/src/app/admin/components/panel/panel.component.html
+++ b/src/app/admin/components/panel/panel.component.html
@@ -4,45 +4,42 @@
     <app-button
       [text]="'Revendication structure'"
       [style]="buttonTypeEnum.Secondary"
-      (click)="changeActiveFeature(features.pendingStructures)"
+      (click)="changeActiveFeature(tab.pendingStructures)"
     />
     <app-button
       [text]="'Liste structures'"
       [style]="buttonTypeEnum.Secondary"
-      (click)="changeActiveFeature(features.structuresList)"
+      (click)="changeActiveFeature(tab.structuresList)"
     />
     <app-button
-      [text]="'Gestion des utilisateurs'"
+      [text]="'Structures supprimées'"
       [style]="buttonTypeEnum.Secondary"
-      (click)="changeActiveFeature(features.manageUsers)"
+      (click)="changeActiveFeature(tab.deletedStructures)"
     />
     <app-button
-      [text]="'Infos covid'"
+      [text]="'Gestion des utilisateurs'"
       [style]="buttonTypeEnum.Secondary"
-      (click)="changeActiveFeature(features.lockdownInfo)"
+      (click)="changeActiveFeature(tab.manageUsers)"
     />
     <app-button
-      [text]="'Fonctions'"
+      [text]="'Infos covid'"
       [style]="buttonTypeEnum.Secondary"
-      (click)="changeActiveFeature(features.jobsList)"
+      (click)="changeActiveFeature(tab.lockdownInfo)"
     />
+    <app-button [text]="'Fonctions'" [style]="buttonTypeEnum.Secondary" (click)="changeActiveFeature(tab.jobsList)" />
     <app-button
       [text]="'Employeurs'"
       [style]="buttonTypeEnum.Secondary"
-      (click)="changeActiveFeature(features.employersList)"
+      (click)="changeActiveFeature(tab.employersList)"
     />
     <a target="_blank" class="custom-link" rel="noopener noreferrer" [href]="ghostLink">Ghost</a>
   </div>
 
-  <app-admin-structures-list *ngIf="selectedFeature === features.structuresList" />
-
-  <app-admin-manage-users *ngIf="selectedFeature === features.manageUsers" />
-
-  <app-admin-claim-structure *ngIf="selectedFeature === features.pendingStructures" />
-
-  <app-admin-manage-lockdown-info *ngIf="selectedFeature === features.lockdownInfo" />
-
-  <app-admin-manage-jobs *ngIf="selectedFeature === features.jobsList" />
-
-  <app-admin-manage-employers *ngIf="selectedFeature === features.employersList" />
+  <app-deleted-structures *ngIf="selectedTab === tab.deletedStructures" />
+  <app-admin-structures-list *ngIf="selectedTab === tab.structuresList" />
+  <app-admin-manage-users *ngIf="selectedTab === tab.manageUsers" />
+  <app-admin-claim-structure *ngIf="selectedTab === tab.pendingStructures" />
+  <app-admin-manage-lockdown-info *ngIf="selectedTab === tab.lockdownInfo" />
+  <app-admin-manage-jobs *ngIf="selectedTab === tab.jobsList" />
+  <app-admin-manage-employers *ngIf="selectedTab === tab.employersList" />
 </div>
diff --git a/src/app/admin/components/panel/panel.component.ts b/src/app/admin/components/panel/panel.component.ts
index ff37d5f88..94b1bde1c 100644
--- a/src/app/admin/components/panel/panel.component.ts
+++ b/src/app/admin/components/panel/panel.component.ts
@@ -1,4 +1,4 @@
-import { Component, OnInit } from '@angular/core';
+import { Component } from '@angular/core';
 import { RuntimeConfigLoaderService } from 'runtime-config-loader';
 import { ButtonType } from '../../../shared/components/button/buttonType.enum';
 import { AdminPanelEnum } from '../../../shared/enum/adminPanel.enum';
@@ -9,10 +9,10 @@ import { PanelRouteService } from '../../services/panel-route.service';
   templateUrl: './panel.component.html',
   providers: [PanelRouteService],
 })
-export class PanelComponent implements OnInit {
-  public features = AdminPanelEnum;
+export class PanelComponent {
   public ghostLink = this.runtimeConfigLoaderService.getConfigObjectKey('ghostAdmin');
-  public selectedFeature;
+  public selectedTab = AdminPanelEnum.pendingStructures;
+  public tab = AdminPanelEnum;
   public buttonTypeEnum = ButtonType;
 
   constructor(
@@ -20,15 +20,11 @@ export class PanelComponent implements OnInit {
     private runtimeConfigLoaderService: RuntimeConfigLoaderService
   ) {
     this.panelRouteService.destinationChanged$.subscribe((selected: AdminPanelEnum) => {
-      this.selectedFeature = selected;
+      this.selectedTab = selected;
     });
   }
 
-  ngOnInit(): void {
-    this.selectedFeature = this.features.pendingStructures;
-  }
-
   public changeActiveFeature(newFeature: AdminPanelEnum): void {
-    this.selectedFeature = newFeature;
+    this.selectedTab = newFeature;
   }
 }
diff --git a/src/app/admin/services/admin.service.ts b/src/app/admin/services/admin.service.ts
index 2f5d09e88..b7e5e720b 100644
--- a/src/app/admin/services/admin.service.ts
+++ b/src/app/admin/services/admin.service.ts
@@ -3,6 +3,7 @@ import { Injectable } from '@angular/core';
 import { Observable } from 'rxjs';
 import { Employer } from '../../models/employer.model';
 import { Job } from '../../models/job.model';
+import { Structure } from '../../models/structure.model';
 import { User } from '../../models/user.model';
 import { StructureAdminInfo } from '../models/demandAttachment.model';
 
@@ -168,4 +169,8 @@ export class AdminService {
       structureName,
     });
   }
+
+  public getDeletedStructures(): Observable<Structure[]> {
+    return this.http.get<Structure[]>(`${this.baseUrl}/getDeletedStructures`);
+  }
 }
diff --git a/src/app/models/structure.model.ts b/src/app/models/structure.model.ts
index 4d0e65207..91c6f4d33 100644
--- a/src/app/models/structure.model.ts
+++ b/src/app/models/structure.model.ts
@@ -15,6 +15,8 @@ export class Structure {
   public numero: string = null;
   public createdAt: string = null;
   public updatedAt: string = null;
+  /** This value is only available as an admin */
+  public deletedAt?: string = null;
   public toBeDeletedAt?: string = null;
   public structureName: string = null;
   public structureType?: StructureType = null;
diff --git a/src/app/shared/enum/adminPanel.enum.ts b/src/app/shared/enum/adminPanel.enum.ts
index c6c1e63e5..8432a8294 100644
--- a/src/app/shared/enum/adminPanel.enum.ts
+++ b/src/app/shared/enum/adminPanel.enum.ts
@@ -1,8 +1,9 @@
 export enum AdminPanelEnum {
+  deletedStructures,
+  employersList,
+  jobsList,
+  lockdownInfo,
   manageUsers,
   pendingStructures,
   structuresList,
-  jobsList,
-  employersList,
-  lockdownInfo,
 }
diff --git a/src/app/structure-list/components/structure-details/structure-details.component.html b/src/app/structure-list/components/structure-details/structure-details.component.html
index 1c3d8e369..2faef09c9 100644
--- a/src/app/structure-list/components/structure-details/structure-details.component.html
+++ b/src/app/structure-list/components/structure-details/structure-details.component.html
@@ -113,7 +113,14 @@
             {{ structureAdmin.email }}
           </div>
         </div>
-        <a class="primary" tabindex="0" (click)="toggleDeleteModal()" (keyup.enter)="toggleDeleteModal()">
+        <div *ngIf="structure.deletedAt">Supprimée le {{ structure.deletedAt | date : 'mediumDate' }}</div>
+        <a
+          *ngIf="!structure.deletedAt"
+          class="primary"
+          tabindex="0"
+          (click)="toggleDeleteModal()"
+          (keyup.enter)="toggleDeleteModal()"
+        >
           Supprimer cette structure
         </a>
       </div>
-- 
GitLab