From 7cfa91ffca0ad6d0720130fc9d4afa52e4eec712 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marl=C3=A8ne=20SIMONDANT?= <msimondant@grandlyon.com>
Date: Tue, 17 May 2022 09:03:50 +0000
Subject: [PATCH] feat(admin) : add admin page with checkbox to display / hide
 covid information in structure details

---
 src/app/admin/admin-pannel.scss               | 25 +++++++++++++++
 src/app/admin/admin.module.ts                 |  2 ++
 .../manage-lockdown-info.component.html       | 19 ++++++++++++
 .../manage-lockdown-info.component.spec.ts    | 24 ++++++++++++++
 .../manage-lockdown-info.component.ts         | 31 +++++++++++++++++++
 .../components/panel/panel.component.html     |  4 +++
 src/app/admin/services/parameters.service.ts  | 19 ++++++++++++
 src/app/shared/enum/adminPanel.enum.ts        |  1 +
 8 files changed, 125 insertions(+)
 create mode 100644 src/app/admin/components/lockdown-info/manage-lockdown-info.component.html
 create mode 100644 src/app/admin/components/lockdown-info/manage-lockdown-info.component.spec.ts
 create mode 100644 src/app/admin/components/lockdown-info/manage-lockdown-info.component.ts
 create mode 100644 src/app/admin/services/parameters.service.ts

diff --git a/src/app/admin/admin-pannel.scss b/src/app/admin/admin-pannel.scss
index 5ced4166a..1b7c40a19 100644
--- a/src/app/admin/admin-pannel.scss
+++ b/src/app/admin/admin-pannel.scss
@@ -26,3 +26,28 @@
 .structure-updated-at {
   text-align: right;
 }
+
+.error {
+  color: red;
+  font-weight: bold;
+}
+
+.singleCheckbox {
+  background: $white;
+  border-radius: 4px;
+  padding: 0 16px;
+  height: 44px;
+  padding-top: 22px;
+  outline: none;
+  border: 1px solid;
+  margin: 8px 0;
+  &.checked {
+    color: $white;
+    background: $green-1;
+    border: none;
+  }
+  input,
+  label {
+    cursor: pointer;
+  }
+}
diff --git a/src/app/admin/admin.module.ts b/src/app/admin/admin.module.ts
index 29e6689e7..d937cc788 100644
--- a/src/app/admin/admin.module.ts
+++ b/src/app/admin/admin.module.ts
@@ -6,6 +6,7 @@ import { ManageUsersComponent } from './components/manage-users/manage-users.com
 import { SharedModule } from '../shared/shared.module';
 import { NewsletterUsersComponent } from './components/newsletter-users/newsletter-users.component';
 import { AdminStructuresListComponent } from './components/structures-list/admin-structures-list.component';
+import { ManageLockdownInfoComponent } from './components/lockdown-info/manage-lockdown-info.component';
 import { AdminRoutingModule } from './admin-routing.module';
 import { AgGridModule } from 'ag-grid-angular';
 import { DeleteUserComponent } from './components/manage-users/delete-user/delete-user.component';
@@ -17,6 +18,7 @@ import { AdministredStructuresComponent } from './components/manage-users/admini
     ClaimStructureComponent,
     NewsletterUsersComponent,
     AdminStructuresListComponent,
+    ManageLockdownInfoComponent,
     ManageUsersComponent,
     DeleteUserComponent,
     AdministredStructuresComponent,
diff --git a/src/app/admin/components/lockdown-info/manage-lockdown-info.component.html b/src/app/admin/components/lockdown-info/manage-lockdown-info.component.html
new file mode 100644
index 000000000..942e5a16c
--- /dev/null
+++ b/src/app/admin/components/lockdown-info/manage-lockdown-info.component.html
@@ -0,0 +1,19 @@
+<div *ngIf="isLoading" class="loader">
+  <img class="loader-gif" src="/assets/gif/loader_circle.gif" alt />
+</div>
+<div *ngIf="!isLoading" fxLayout="column" fxLayoutAlign="center center">
+  <H2>Gestion de l'affichage des infos Covid</H2>
+  <div *ngIf="lockdownInfoDisplay">Les infos covid sont actuellement affichées dans les fiches structure.</div>
+  <div *ngIf="!lockdownInfoDisplay">Les infos covid ne sont actuellement pas affichées dans les fiches structure.</div>
+  <div *ngIf="!error" class="singleCheckbox" [ngClass]="{ checked: lockdownInfoDisplay }">
+    <input
+      type="checkbox"
+      name="lockdownInfo"
+      id="lockdownInfo"
+      [checked]="lockdownInfoDisplay"
+      (change)="toggleLockdownInfo()"
+    />
+    <label for="lockdownInfo"> Afficher les infos covid</label>
+  </div>
+  <p *ngIf="error" class="error">Une erreur s'est produite a l'enregistrement, veuillez ré-essayer plus tard.</p>
+</div>
diff --git a/src/app/admin/components/lockdown-info/manage-lockdown-info.component.spec.ts b/src/app/admin/components/lockdown-info/manage-lockdown-info.component.spec.ts
new file mode 100644
index 000000000..ba95d305f
--- /dev/null
+++ b/src/app/admin/components/lockdown-info/manage-lockdown-info.component.spec.ts
@@ -0,0 +1,24 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ManageLockdownInfoComponent } from './manage-lockdown-info.component';
+
+describe('ManageLockdownInfoComponent', () => {
+  let component: ManageLockdownInfoComponent;
+  let fixture: ComponentFixture<ManageLockdownInfoComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [ManageLockdownInfoComponent],
+    }).compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(ManageLockdownInfoComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/src/app/admin/components/lockdown-info/manage-lockdown-info.component.ts b/src/app/admin/components/lockdown-info/manage-lockdown-info.component.ts
new file mode 100644
index 000000000..187fb3541
--- /dev/null
+++ b/src/app/admin/components/lockdown-info/manage-lockdown-info.component.ts
@@ -0,0 +1,31 @@
+import { Component, OnInit } from '@angular/core';
+import { ParametersService } from '../../services/parameters.service';
+
+@Component({
+  selector: 'app-admin-manage-lockdown-info',
+  templateUrl: './manage-lockdown-info.component.html',
+  styleUrls: ['../../admin-pannel.scss'],
+})
+export class ManageLockdownInfoComponent implements OnInit {
+  public isLoading: boolean = true;
+  public lockdownInfoDisplay: boolean;
+  public error: boolean = false;
+  constructor(private parametersService: ParametersService) {}
+
+  ngOnInit(): void {
+    this.parametersService.getParameters().subscribe((params) => {
+      this.lockdownInfoDisplay = params.lockdownInfoDisplay;
+      this.isLoading = false;
+    });
+  }
+
+  public toggleLockdownInfo() {
+    this.lockdownInfoDisplay = !this.lockdownInfoDisplay;
+    this.parametersService.SetLockdownInfoDisplay(this.lockdownInfoDisplay).subscribe(
+      () => {},
+      () => {
+        this.error = true;
+      }
+    );
+  }
+}
diff --git a/src/app/admin/components/panel/panel.component.html b/src/app/admin/components/panel/panel.component.html
index 0443ed9b8..8cc0ae138 100644
--- a/src/app/admin/components/panel/panel.component.html
+++ b/src/app/admin/components/panel/panel.component.html
@@ -4,6 +4,7 @@
     <button (click)="changeActiveFeature(features.pendingStructures)">Revendication structure</button>
     <button (click)="changeActiveFeature(features.structuresList)">Liste structures</button>
     <button (click)="changeActiveFeature(features.deleteUsers)">Gestion des utilisateurs</button>
+    <button (click)="changeActiveFeature(features.lockdownInfo)">Gestion des infos covid</button>
     <button (click)="changeActiveFeature(features.newsletterUsers)">Newsletter</button>
     <a target="_blank" class="custom-link" rel="noopener noreferrer" [href]="ghostLink">Ghost</a>
   </div>
@@ -16,6 +17,9 @@
   <div *ngIf="selectedFeature === features.pendingStructures">
     <app-admin-claim-structure></app-admin-claim-structure>
   </div>
+  <div *ngIf="selectedFeature === features.lockdownInfo">
+    <app-admin-manage-lockdown-info></app-admin-manage-lockdown-info>
+  </div>
   <div *ngIf="selectedFeature === features.newsletterUsers">
     <app-admin-newsletter-users></app-admin-newsletter-users>
   </div>
diff --git a/src/app/admin/services/parameters.service.ts b/src/app/admin/services/parameters.service.ts
new file mode 100644
index 000000000..149900697
--- /dev/null
+++ b/src/app/admin/services/parameters.service.ts
@@ -0,0 +1,19 @@
+import { HttpClient } from '@angular/common/http';
+import { Injectable } from '@angular/core';
+import { Observable } from 'rxjs';
+
+@Injectable({
+  providedIn: 'root',
+})
+export class ParametersService {
+  private readonly baseUrl = 'api/';
+  constructor(private http: HttpClient) {}
+
+  public getParameters(): Observable<any> {
+    return this.http.get<any>(`${this.baseUrl}parameters`);
+  }
+
+  public SetLockdownInfoDisplay(lockdownInfoDisplay: boolean): Observable<any> {
+    return this.http.post(`${this.baseUrl}parameters/`, { lockdownInfoDisplay });
+  }
+}
diff --git a/src/app/shared/enum/adminPanel.enum.ts b/src/app/shared/enum/adminPanel.enum.ts
index 7608abd46..1c82cf1e5 100644
--- a/src/app/shared/enum/adminPanel.enum.ts
+++ b/src/app/shared/enum/adminPanel.enum.ts
@@ -3,4 +3,5 @@ export enum AdminPannelEnum {
   pendingStructures,
   newsletterUsers,
   structuresList,
+  lockdownInfo,
 }
-- 
GitLab