From e7fcf1e28eb71d52e3bbf11b7dcad548bc59f659 Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Mon, 3 Apr 2023 08:45:08 +0000 Subject: [PATCH 01/47] fix(edit-structure): formatting name of members --- .../structure-members-management.component.html | 4 +++- .../structure-details/structure-details.component.html | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/profile/structure-members-management/structure-members-management.component.html b/src/app/profile/structure-members-management/structure-members-management.component.html index ef7bdc218..5034bb3ce 100644 --- a/src/app/profile/structure-members-management/structure-members-management.component.html +++ b/src/app/profile/structure-members-management/structure-members-management.component.html @@ -35,7 +35,9 @@ [iconClass]="'icon-40'" /> <div class="info-member"> - <a class="member" routerLink="/profile/{{ member._id }}">{{ member.name }} {{ member.surname }}</a> + <a class="member" routerLink="/profile/{{ member._id }}"> + {{ member.name | userName }} {{ member.surname | uppercase }} + </a> <p *ngIf="displayJobEmployer(member)" class="job">{{ displayJobEmployer(member) }}</p> </div> </div> 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 5a3649df9..1c3d8e369 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 @@ -319,9 +319,9 @@ <div *ngFor="let member of structureAdmins" class="member-card"> <app-svg-icon class="avatar" [type]="'avatar'" [icon]="'defaultAvatar'" [iconClass]="'icon-40'" /> <div class="info-member"> - <a class="member" routerLink="/profile/{{ member._id }}" - >{{ member.name | userName }} {{ member.surname | uppercase }}</a - > + <a class="member" routerLink="/profile/{{ member._id }}"> + {{ member.name | userName }} {{ member.surname | uppercase }} + </a> <p *ngIf="member.job?.name" class="job">{{ member.job?.name }}</p> </div> </div> -- GitLab From 36b240c26ea2645ab175e3c913d49b4652493ac3 Mon Sep 17 00:00:00 2001 From: Etienne LOUPIAS <eloupias@grandlyon.com> Date: Mon, 3 Apr 2023 11:46:39 +0200 Subject: [PATCH 02/47] feat(admin): faster map display --- src/app/carto/carto.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/carto/carto.component.ts b/src/app/carto/carto.component.ts index 3b91c2512..f6e728144 100644 --- a/src/app/carto/carto.component.ts +++ b/src/app/carto/carto.component.ts @@ -2,7 +2,7 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Meta } from '@angular/platform-browser'; import { ActivatedRoute } from '@angular/router'; import * as _ from 'lodash'; -import { Observable } from 'rxjs'; +import { Observable, firstValueFrom } from 'rxjs'; import { GeoJson } from '../map/models/geojson.model'; import { Structure } from '../models/structure.model'; import { ProfileService } from '../profile/services/profile.service'; @@ -125,7 +125,7 @@ export class CartoComponent implements OnInit { structure = this.getStructurePosition(structure, lon, lat); } if (this.isAdmin) { - structure.isClaimed = await this.isClaimed(structure).toPromise(); + firstValueFrom(this.isClaimed(structure)).then((isClaimed) => (isClaimed = structure.isClaimed)); } return structure; }) -- GitLab From 829f5e5f6ded05c97ecb83bfe9f9373f0271ea10 Mon Sep 17 00:00:00 2001 From: Etienne LOUPIAS <eloupias@grandlyon.com> Date: Mon, 3 Apr 2023 14:20:17 +0200 Subject: [PATCH 03/47] fix(config): add config asset for local build --- angular.json | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/angular.json b/angular.json index 17ca42ce4..5b36cae18 100644 --- a/angular.json +++ b/angular.json @@ -91,6 +91,7 @@ "serviceWorker": true, "ngswConfigPath": "ngsw-config.json" }, + "local": {}, "fr": { "localize": ["fr"] }, @@ -110,6 +111,9 @@ "production": { "browserTarget": "pamn:build:production" }, + "local": { + "browserTarget": "pamn:build:local" + }, "fr": { "browserTarget": "pamn:build:fr" }, diff --git a/package.json b/package.json index 4f41f75dc..05935152c 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "2.2.0", "scripts": { "ng": "ng", - "start": "ng serve --configuration=fr --proxy-config proxy.conf.json", + "start": "ng serve --configuration=local,fr --proxy-config proxy.conf.json", "start-pwa": "npm run build:prod && http-server -p 8080 -c-1 dist/fr --proxy http://localhost:3000", "build:prod": "ng build --configuration=production,fr --output-path=dist --output-hashing=all --subresource-integrity", "build:dev": "ng build --configuration=production,fr --output-path=dist --output-hashing=all --subresource-integrity", -- GitLab From 5361ca0b003bf4c3069fa230f6d08afb12bcdbd3 Mon Sep 17 00:00:00 2001 From: Renovate-Bot <le.rameur.94@gmail.com> Date: Mon, 3 Apr 2023 13:57:49 +0000 Subject: [PATCH 04/47] fix(deps): update ag-grid monorepo to v29 (major) --- package-lock.json | 26 +++++++++++++------------- package.json | 6 +++--- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 51550c7a8..168f44bfd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,16 +11,16 @@ "dev": true }, "@ag-grid-community/core": { - "version": "28.2.1", - "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-28.2.1.tgz", - "integrity": "sha512-qGhqZhY8KbPlr3cJBVkNjGKu+cOyFc8IGvPcvlm0pjNC9cdxO/ct9Sa1Dg+k3ACCEroMEt1apBvnoOgurpvewQ==" + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/core/-/core-29.2.0.tgz", + "integrity": "sha512-1G0X3DrCCfH/vngBXz5rKRhlNmb/WPy/kTtfy/Yo+XOAChs+lgMGG/dgurY/blRyCaMQsUO3aZoJmcckYG4/eQ==" }, "@ag-grid-community/csv-export": { - "version": "28.2.1", - "resolved": "https://registry.npmjs.org/@ag-grid-community/csv-export/-/csv-export-28.2.1.tgz", - "integrity": "sha512-LILJCp9K9wdpqNyuMxqH90BsZZ7MvhFNmTZGIYciRTf1pgURdolZFCuuxdMi32D7Qzxa0gpYCljmXf0GJ2uCGQ==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/@ag-grid-community/csv-export/-/csv-export-29.2.0.tgz", + "integrity": "sha512-C/kGoFW5+470RkgYrq6hVDa6hzzc3jzOxJKN8sEcyeib44tRHLLNROpWW36BpEmtb3qLLQZV8VZ9+FeDfYpuMw==", "requires": { - "@ag-grid-community/core": "~28.2.1" + "@ag-grid-community/core": "~29.2.0" } }, "@ampproject/remapping": { @@ -4283,17 +4283,17 @@ } }, "ag-grid-angular": { - "version": "28.2.1", - "resolved": "https://registry.npmjs.org/ag-grid-angular/-/ag-grid-angular-28.2.1.tgz", - "integrity": "sha512-aYJvmrjwDFm2qy6viM9E8WQ0rCLn3nzuTH5gGIDFjqjFExan8csoNmVKGGbuf9jx8VQm4XQHKWbIzd2eT94kvw==", + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/ag-grid-angular/-/ag-grid-angular-29.2.0.tgz", + "integrity": "sha512-WAcrDePU79milC0rru2D0xrnXDL2O3Mg/m7yFVKNIhY1NLEXdxX22vreqYJhxsk1gcQcWxSxRE2KPY0qPlty4g==", "requires": { "tslib": "^2.3.0" } }, "ag-grid-community": { - "version": "28.2.1", - "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-28.2.1.tgz", - "integrity": "sha512-DMZh/xD/FqYP17qJ1M92PolTYe+hrKuEaf+A4h13O6qn2x/xZQrTRGW5DgnQLR/uLMe1XXZQPKR3UKgAlKo69A==" + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-29.2.0.tgz", + "integrity": "sha512-1xP1fpM8gXp2ALzBLONejZNul9hA3//ddszSlhq79QZ1FskQ1Z7E2WvvFeCeLJTJZrfhQkT1q1LO5DGfGeiBvg==" }, "agent-base": { "version": "6.0.2", diff --git a/package.json b/package.json index 4f41f75dc..1f835cb5e 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ }, "private": true, "dependencies": { - "@ag-grid-community/csv-export": "^28.2.1", + "@ag-grid-community/csv-export": "^29.0.0", "@angular/animations": "^15.1.3", "@angular/cdk": "^15.1.2", "@angular/common": "^15.1.3", @@ -32,8 +32,8 @@ "@ngx-matomo/router": "^4.0.1", "@ngx-matomo/tracker": "^4.0.1", "@ngx-translate/core": "^14.0.0", - "ag-grid-angular": "^28.0.0", - "ag-grid-community": "^28.0.0", + "ag-grid-angular": "^29.0.0", + "ag-grid-community": "^29.0.0", "jwt-decode": "^3.1.2", "leaflet": "^1.9.2", "leaflet.locatecontrol": "^0.79.0", -- GitLab From 7559bfd723e8eeca082868976de6b1c267a833b3 Mon Sep 17 00:00:00 2001 From: Bastien Dumont <bdumont@grandlyon.com> Date: Tue, 4 Apr 2023 16:36:35 +0200 Subject: [PATCH 05/47] chore: add node-version --- .node-version | 1 + 1 file changed, 1 insertion(+) create mode 100644 .node-version diff --git a/.node-version b/.node-version new file mode 100644 index 000000000..835d07c44 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +v14.20.1 -- GitLab From ba017b72eb29cecb0f8bc98fcb984dee2c8880e3 Mon Sep 17 00:00:00 2001 From: Bastien Dumont <bdumont@grandlyon.com> Date: Tue, 4 Apr 2023 16:37:23 +0200 Subject: [PATCH 06/47] chore: node 14 --- .node-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.node-version b/.node-version index 835d07c44..958b5a36e 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -v14.20.1 +v14 -- GitLab From 2d8c1e496d634a8718c5ad46ad76efda15c0683a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20PAILHAREY?= <rpailharey@grandlyon.com> Date: Wed, 5 Apr 2023 08:06:17 +0000 Subject: [PATCH 07/47] feat: display the connected user in the list of its structures --- .../profile-structure.component.html | 14 ---------- .../profile-structure.component.ts | 28 +++---------------- src/app/profile/profile.component.ts | 4 +-- .../structure-edition-summary.component.html | 18 +++--------- .../structure-edition-summary.component.ts | 2 +- ...tructure-members-management.component.html | 1 + .../structure-members-management.component.ts | 5 ++-- .../structures-management.component.ts | 2 +- src/app/services/structure.service.ts | 4 +-- .../structure-details.component.ts | 2 +- .../structure-exclude.component.ts | 2 +- 11 files changed, 20 insertions(+), 62 deletions(-) diff --git a/src/app/profile/profile-structure/profile-structure.component.html b/src/app/profile/profile-structure/profile-structure.component.html index fd6d35016..82acb1444 100644 --- a/src/app/profile/profile-structure/profile-structure.component.html +++ b/src/app/profile/profile-structure/profile-structure.component.html @@ -133,15 +133,6 @@ <app-profile-structure-member *ngFor="let member of members; let i = index" [member]="member" /> </div> </div> - <div *ngIf="!isPublic && members.length === 0 && !isPending" class="call-to-action"> - <app-button - [iconBtn]="'add'" - [text]="'Ajouter un membre'" - [style]="buttonTypeEnum.SecondaryUltraWide" - [routerLinkActive]="'active'" - (click)="addMemberModalOpened = true" - /> - </div> <div *ngIf="!isPublic && !this.personalOffer && userProfile.job?.hasPersonalOffer && !isPending" class="call-to-action" @@ -156,8 +147,3 @@ </div> </div> </div> -<app-structure-add-member-modal - [opened]="addMemberModalOpened && !isPending" - [structure]="structureWithOwners" - (closed)="closeAddMemberModal($event)" -/> diff --git a/src/app/profile/profile-structure/profile-structure.component.ts b/src/app/profile/profile-structure/profile-structure.component.ts index 9a7de2a0a..89c924064 100644 --- a/src/app/profile/profile-structure/profile-structure.component.ts +++ b/src/app/profile/profile-structure/profile-structure.component.ts @@ -55,15 +55,11 @@ export class ProfileStructureComponent implements OnInit { async ngOnInit(): Promise<void> { this.structureForm = new formUtils().createStructureForm(this.structureWithOwners.structure, true); - this.structureWithOwners.owners - .filter((owner) => { - return owner._id !== this.userProfile._id; - }) - .forEach((owner) => { - this.userService.getUser(owner._id).subscribe((res) => { - this.members.push(res); - }); + this.structureWithOwners.owners.forEach((owner) => { + this.userService.getUser(owner._id).subscribe((user) => { + this.members.push(user); }); + }); this.structure = new Structure(this.structureWithOwners.structure); this.personalOffer = await this.getSharedPersonalOffer(); } @@ -120,22 +116,6 @@ export class ProfileStructureComponent implements OnInit { : address.street + ' - ' + address.commune; } - public closeAddMemberModal(memberAddRequested: boolean): void { - this.addMemberModalOpened = false; - if (memberAddRequested) { - this.ngOnInit(); - this.structureService - .getStructureWithOwners(this.structureWithOwners.structure._id, this.userProfile) - .subscribe((result) => { - this.structureWithOwners = result; - result.owners.forEach((owner) => { - this.userService.getUser(owner._id).subscribe((res) => { - this.members.push(res); - }); - }); - }); - } - } public getFormattedDate(): string { if (this.joinRequestDate) { return DateTime.fromISO(this.joinRequestDate, { zone: 'Europe/Paris' }).toFormat('dd/MM/yyyy'); diff --git a/src/app/profile/profile.component.ts b/src/app/profile/profile.component.ts index 211b69258..c0a19627b 100644 --- a/src/app/profile/profile.component.ts +++ b/src/app/profile/profile.component.ts @@ -72,7 +72,7 @@ export class ProfileComponent implements OnInit { this.userProfile.structuresLink.forEach((structureId) => { structures$.push( - this.structureService.getStructureWithOwners(structureId, null).pipe( + this.structureService.getStructureWithOwners(structureId).pipe( tap((structure) => { this.structures.push(structure); }) @@ -88,7 +88,7 @@ export class ProfileComponent implements OnInit { this.structures = []; this.userProfile.pendingStructuresLink.forEach((pending: pendingStructureLink) => { structures$.push( - this.structureService.getStructureWithOwners(pending.id, null).pipe( + this.structureService.getStructureWithOwners(pending.id).pipe( tap((structure) => { this.pendingStructures.push(structure); }) diff --git a/src/app/profile/structure-edition-summary/structure-edition-summary.component.html b/src/app/profile/structure-edition-summary/structure-edition-summary.component.html index 081a360c3..15cdad98c 100644 --- a/src/app/profile/structure-edition-summary/structure-edition-summary.component.html +++ b/src/app/profile/structure-edition-summary/structure-edition-summary.component.html @@ -691,20 +691,10 @@ /> </div> <div *ngIf="members" class="content"> - <div *ngIf="profileService.isAdmin()"> - <div [ngPlural]="members.length"> - <ng-template ngPluralCase="0">Aucun membre</ng-template> - <ng-template ngPluralCase="1">1 membre</ng-template> - <ng-template ngPluralCase="other">{{ members.length }} membres</ng-template> - </div> - </div> - <div *ngIf="!profileService.isAdmin()"> - <div [ngPlural]="members.length"> - <ng-template ngPluralCase="0">Aucun membre</ng-template> - <ng-template ngPluralCase="1">Aucun autre membre</ng-template> - <ng-template ngPluralCase="2">1 membre</ng-template> - <ng-template ngPluralCase="other">{{ members.length - 1 }} membres</ng-template> - </div> + <div [ngPlural]="members.length"> + <ng-template ngPluralCase="0">Aucun membre</ng-template> + <ng-template ngPluralCase="1">1 membre</ng-template> + <ng-template ngPluralCase="other">{{ members.length }} membres</ng-template> </div> </div> </div> diff --git a/src/app/profile/structure-edition-summary/structure-edition-summary.component.ts b/src/app/profile/structure-edition-summary/structure-edition-summary.component.ts index d90b7ed5e..f4a6562b4 100644 --- a/src/app/profile/structure-edition-summary/structure-edition-summary.component.ts +++ b/src/app/profile/structure-edition-summary/structure-edition-summary.component.ts @@ -70,7 +70,7 @@ export class StructureEditionSummaryComponent implements OnInit { if (updatedAt < sixMonthsAgo) this.isUpdateStructure = true; this.structureService - .getStructureWithOwners(data.structure._id, null) + .getStructureWithOwners(data.structure._id) .subscribe((result) => (this.members = result.owners)); } }); diff --git a/src/app/profile/structure-members-management/structure-members-management.component.html b/src/app/profile/structure-members-management/structure-members-management.component.html index 5034bb3ce..70499f35b 100644 --- a/src/app/profile/structure-members-management/structure-members-management.component.html +++ b/src/app/profile/structure-members-management/structure-members-management.component.html @@ -42,6 +42,7 @@ </div> </div> <app-button + *ngIf="currentProfile._id !== member._id" class="button-member" tabindex="0" [style]="buttonTypeEnum.Secondary" diff --git a/src/app/profile/structure-members-management/structure-members-management.component.ts b/src/app/profile/structure-members-management/structure-members-management.component.ts index e7f614ad5..972d23f56 100644 --- a/src/app/profile/structure-members-management/structure-members-management.component.ts +++ b/src/app/profile/structure-members-management/structure-members-management.component.ts @@ -28,6 +28,7 @@ export class StructureMembersManagementComponent implements OnInit { public cancelAddTempUserModalOpened = false; public buttonTypeEnum = ButtonType; public isLoading = true; + public currentProfile: User; constructor( private route: ActivatedRoute, @@ -40,9 +41,9 @@ export class StructureMembersManagementComponent implements OnInit { this.route.data.subscribe(async (data) => { if (data.structure) { this.structure = new Structure(data.structure); - let currentProfile = await this.profileService.getProfile(); + this.currentProfile = await this.profileService.getProfile(); this.structureService - .getStructureWithOwners(data.structure._id, currentProfile) + .getStructureWithOwners(data.structure._id) .pipe(finalize(() => (this.isLoading = false))) .subscribe((s) => { this.structureWithOwners = s; diff --git a/src/app/profile/structures-management/structures-management.component.ts b/src/app/profile/structures-management/structures-management.component.ts index 69c81f6c5..ae3a5ee01 100644 --- a/src/app/profile/structures-management/structures-management.component.ts +++ b/src/app/profile/structures-management/structures-management.component.ts @@ -52,7 +52,7 @@ export class StructuresManagementComponent implements OnInit { this.userProfile.structuresLink.forEach((structureId) => { structures$.push( - this.structureService.getStructureWithOwners(structureId, null).pipe( + this.structureService.getStructureWithOwners(structureId).pipe( tap((structure) => { this.structures.push(structure); }) diff --git a/src/app/services/structure.service.ts b/src/app/services/structure.service.ts index 5136c999d..6555db827 100644 --- a/src/app/services/structure.service.ts +++ b/src/app/services/structure.service.ts @@ -100,8 +100,8 @@ export class StructureService { }); } - public getStructureWithOwners(structureId: string, profile: User): Observable<StructureWithOwners> { - return this.http.post<any>(`${this.baseUrl}/${structureId}/withOwners`, { emailUser: profile?.email }); + public getStructureWithOwners(structureId: string): Observable<StructureWithOwners> { + return this.http.get<StructureWithOwners>(`${this.baseUrl}/${structureId}/withOwners`); } public getTempUsers(structureId: string): Observable<TempUser[]> { diff --git a/src/app/structure-list/components/structure-details/structure-details.component.ts b/src/app/structure-list/components/structure-details/structure-details.component.ts index 0fda98b52..89ffc5773 100644 --- a/src/app/structure-list/components/structure-details/structure-details.component.ts +++ b/src/app/structure-list/components/structure-details/structure-details.component.ts @@ -108,7 +108,7 @@ export class StructureDetailsComponent implements OnInit { private async initForm(): Promise<void> { if (this.userIsLoggedIn()) { this.currentProfile = await this.profileService.getProfile(); - this.structureService.getStructureWithOwners(this.structure._id, this.currentProfile).subscribe((res) => { + this.structureService.getStructureWithOwners(this.structure._id).subscribe((res) => { this.structureAdmins = res.owners; }); } diff --git a/src/app/structure/structure-exclude/structure-exclude.component.ts b/src/app/structure/structure-exclude/structure-exclude.component.ts index 06753c307..8d74f4655 100644 --- a/src/app/structure/structure-exclude/structure-exclude.component.ts +++ b/src/app/structure/structure-exclude/structure-exclude.component.ts @@ -35,7 +35,7 @@ export class StructureExcludeComponent implements OnInit { this.userService.getUser(params.get('userId')).subscribe((res) => { this.newMemberName = res.name + ' ' + res.surname; }); - this.structureService.getStructureWithOwners(params.get('id'), null).subscribe((res) => { + this.structureService.getStructureWithOwners(params.get('id')).subscribe((res) => { this.structure = res.structure; const owners = res.owners; const isOwner = owners.find((owner) => owner._id === params.get('userId')); -- GitLab 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 08/47] 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 From 3a1cf3dc2f5f64254c5e938bd861e38431086abf Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Wed, 5 Apr 2023 08:37:09 +0000 Subject: [PATCH 09/47] chore(types): fix types errors --- src/app/annuaire/search-bar/search-bar.component.ts | 1 - src/app/carto/carto.component.ts | 4 ++-- .../structure-list-search/structure-list-search.component.ts | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/app/annuaire/search-bar/search-bar.component.ts b/src/app/annuaire/search-bar/search-bar.component.ts index c6824e987..a6f0f5bc7 100644 --- a/src/app/annuaire/search-bar/search-bar.component.ts +++ b/src/app/annuaire/search-bar/search-bar.component.ts @@ -18,7 +18,6 @@ export class SearchBarComponent implements OnInit, OnChanges { @Output() searchEvent = new EventEmitter<SearchQuery>(); @Output() shouldLoad = new EventEmitter<boolean>(); - public locate = false; public addStructureFormModal = false; public buttonTypeEnum = ButtonType; public searchForm: FormGroup; diff --git a/src/app/carto/carto.component.ts b/src/app/carto/carto.component.ts index f6e728144..dc992f620 100644 --- a/src/app/carto/carto.component.ts +++ b/src/app/carto/carto.component.ts @@ -52,7 +52,7 @@ export class CartoComponent implements OnInit { this.getAddress(this.userLongitude, this.userLatitude); } if (navigator.geolocation) { - this.getLocation(this.filters); + this.getLocation(); } } @@ -174,7 +174,7 @@ export class CartoComponent implements OnInit { return structure; } - public getLocation(filters: Filter[]): void { + public getLocation(): void { navigator.geolocation.getCurrentPosition((position) => { this.geolocation = true; if (!this.userLongitude && !this.userLatitude) { diff --git a/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts b/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts index e5aa63ebc..092aeaf6e 100644 --- a/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts +++ b/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts @@ -19,7 +19,6 @@ export class StructureListSearchComponent implements OnInit { @Output() searchEvent = new EventEmitter(); @Input() filters: Filter[] = []; public utils = new Utils(); - public locate = false; // Show/hide form createStructure public buttonTypeEnum = ButtonType; -- GitLab From 9bde518b55a5b6f282260f512f79992211894173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20PAILHAREY?= <rpailharey@grandlyon.com> Date: Wed, 5 Apr 2023 14:27:03 +0000 Subject: [PATCH 10/47] fix: typo in mistake report modal --- .../components/text-input-modal/text-input-modal.component.html | 2 +- .../structure-details/structure-details.component.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/shared/components/text-input-modal/text-input-modal.component.html b/src/app/shared/components/text-input-modal/text-input-modal.component.html index a7ade1d2c..2f8616bbd 100644 --- a/src/app/shared/components/text-input-modal/text-input-modal.component.html +++ b/src/app/shared/components/text-input-modal/text-input-modal.component.html @@ -1,7 +1,7 @@ <div *ngIf="opened" class="modalBackground" ng-controller="myCtrl"> <div class="modal"> <div class="contentModal" fxLayout="column" fxLayoutAlign="space-around center"> - <h3>ATTENTION</h3> + <h3>Signaler une erreur</h3> <p>{{ content }}</p> <textarea #myText id="story" class="textarea" name="story" rows="6" placeholder="{{ placeholder }}"></textarea> <div class="footerModal"> 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 2faef09c9..61cdeed0b 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 @@ -524,7 +524,7 @@ [opened]="structureErrorModalOpened" [placeholder]="'Décrivez l\'erreur ici. Ex: Horaires faux...'" [content]=" - 'Voulez-vous notifier res\'in d\'une erreur sur la fiche de cet acteur ? Votre commentaire sera envoyé à l\'acteur en question ainsi qu\'aux administrateurs.' + 'Votre commentaire sera envoyé aux administrateurs pour une prise en compte de votre remarque. Si vous souhaitez avoir un retour, merci de préciser votre contact.' " (closed)="sendErrorEmail($event)" (newContent)="sendErrorEmail($event)" -- GitLab From 6772e74518961b2b3114df691b93cc382e3fe6fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20PAILHAREY?= <rpailharey@grandlyon.com> Date: Thu, 6 Apr 2023 08:51:04 +0000 Subject: [PATCH 11/47] feat: publicOthers category renamed genre --- src/app/form/form-view/form-view.component.ts | 2 +- .../structure-form/structure-form.component.html | 2 +- .../structure-form/structure-form.component.ts | 6 +++--- .../structure-public-target.component.html | 10 +++++----- .../structure-public-target.component.ts | 2 +- .../online-demarch/onlineDemarch-form.component.html | 2 +- .../orientation-form-view.component.ts | 6 +++--- src/app/models/personalOffer.model.ts | 2 +- src/app/models/structure.model.ts | 2 +- .../structure-edition-summary.component.html | 8 +++----- src/app/shared/enum/category.enum.ts | 2 +- .../structure-details/structure-details.component.html | 4 ++-- .../structure-list-search.component.ts | 2 +- src/app/structure-list/enum/public.enum.ts | 2 +- src/app/utils/formUtils.ts | 2 +- src/app/utils/orientationUtils.ts | 2 +- 16 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/app/form/form-view/form-view.component.ts b/src/app/form/form-view/form-view.component.ts index e15f1a4c9..720f12a74 100644 --- a/src/app/form/form-view/form-view.component.ts +++ b/src/app/form/form-view/form-view.component.ts @@ -452,7 +452,7 @@ export class FormViewComponent implements OnInit, AfterViewInit { categories: { languageAndIlliteracy: this.structureForm.get('categories').get('languageAndIlliteracy').value, handicaps: this.structureForm.get('categories').get('handicaps').value, - publicOthers: this.structureForm.get('categories').get('publicOthers').value, + genre: this.structureForm.get('categories').get('genre').value, }, }; case structureFormStep.structureDigitalHelpingAccompaniment: diff --git a/src/app/form/form-view/structure-form/structure-form.component.html b/src/app/form/form-view/structure-form/structure-form.component.html index 4c7c99c90..9bb4424a8 100644 --- a/src/app/form/form-view/structure-form/structure-form.component.html +++ b/src/app/form/form-view/structure-form/structure-form.component.html @@ -114,7 +114,7 @@ [isEditMode]="isEditMode" [structureForm]="structureForm" [handicaps]="handicaps" - [publicOthers]="publicOthers" + [genre]="genre" [languageAndIlliteracy]="languageAndIlliteracy" [isMandatoryFields]="false" (validateForm)="setValidationsForm()" diff --git a/src/app/form/form-view/structure-form/structure-form.component.ts b/src/app/form/form-view/structure-form/structure-form.component.ts index f7f8ed8de..cbb6c7daa 100644 --- a/src/app/form/form-view/structure-form/structure-form.component.ts +++ b/src/app/form/form-view/structure-form/structure-form.component.ts @@ -51,7 +51,7 @@ export class StructureFormComponent implements OnChanges, OnInit { public labelsQualifications: Category; public onlineProcedures: Category; public age: Category; - public publicOthers: Category; + public genre: Category; public handicaps: Category; public languageAndIlliteracy: Category; public solidarityMaterial: Category; @@ -274,8 +274,8 @@ export class StructureFormComponent implements OnChanges, OnInit { this.languageAndIlliteracy = categ; break; } - case CategoryEnum.publicOthers: { - this.publicOthers = categ; + case CategoryEnum.genre: { + this.genre = categ; break; } case CategoryEnum.solidarityMaterial: { diff --git a/src/app/form/form-view/structure-form/structure-public-target/structure-public-target.component.html b/src/app/form/form-view/structure-form/structure-public-target/structure-public-target.component.html index 725cb30b3..f7ba4ce7c 100644 --- a/src/app/form/form-view/structure-form/structure-public-target/structure-public-target.component.html +++ b/src/app/form/form-view/structure-form/structure-public-target/structure-public-target.component.html @@ -56,18 +56,18 @@ /> </div> </div> - <div *ngIf="publicOthers"> + <div *ngIf="genre"> <div class="title"> - <h4>Autre</h4> + <h4>Genre</h4> </div> <div class="btn-grid"> <app-button - *ngFor="let choice of publicOthers.modules" + *ngFor="let choice of genre.modules" [ngClass]="{ selectedChoice: true }" - [extraClass]="isInArray(choice.id, 'publicOthers') ? 'selected' : ''" + [extraClass]="isInArray(choice.id, 'genre') ? 'selected' : ''" [style]="buttonTypeEnum.CheckButton" [text]="choice.name" - (action)="updateChoicePublic(choice.id, 'publicOthers')" + (action)="updateChoicePublic(choice.id, 'genre')" /> </div> </div> diff --git a/src/app/form/form-view/structure-form/structure-public-target/structure-public-target.component.ts b/src/app/form/form-view/structure-form/structure-public-target/structure-public-target.component.ts index f1fbd1c6f..2c7871bf3 100644 --- a/src/app/form/form-view/structure-form/structure-public-target/structure-public-target.component.ts +++ b/src/app/form/form-view/structure-form/structure-public-target/structure-public-target.component.ts @@ -12,7 +12,7 @@ export class StructurePublicTargetComponent implements OnInit, OnChanges { @Input() age: Category; @Input() languageAndIlliteracy: Category; @Input() handicaps: Category; - @Input() publicOthers: Category; + @Input() genre: Category; @Input() isEditMode: boolean; @Input() isMandatoryFields = true; @Output() updateChoice = new EventEmitter<any>(); diff --git a/src/app/form/orientation-form-view/online-demarch/onlineDemarch-form.component.html b/src/app/form/orientation-form-view/online-demarch/onlineDemarch-form.component.html index e59029fa4..4259b8ace 100644 --- a/src/app/form/orientation-form-view/online-demarch/onlineDemarch-form.component.html +++ b/src/app/form/orientation-form-view/online-demarch/onlineDemarch-form.component.html @@ -32,7 +32,7 @@ [structureForm]="form" [languageAndIlliteracy]="categories.languageAndIlliteracy" [handicaps]="categories.handicaps" - [publicOthers]="categories.publicOthers" + [genre]="categories.genre" [age]="categories.age" [isMandatoryFields]="currentStep === onlineDemarchesMeetingSteps.publicTypeMandatory" (validateForm)="checkValidation()" diff --git a/src/app/form/orientation-form-view/orientation-form-view.component.ts b/src/app/form/orientation-form-view/orientation-form-view.component.ts index 72e5a0ce9..c377ca210 100644 --- a/src/app/form/orientation-form-view/orientation-form-view.component.ts +++ b/src/app/form/orientation-form-view/orientation-form-view.component.ts @@ -84,7 +84,7 @@ export class OrientationFormViewComponent implements OnInit, AfterContentChecked theme: '', modules: [], }, - publicOthers: { + genre: { id: '', name: '', theme: '', @@ -270,8 +270,8 @@ export class OrientationFormViewComponent implements OnInit, AfterContentChecked this.categories.languageAndIlliteracy = categ; break; } - case CategoryEnum.publicOthers: { - this.categories.publicOthers = categ; + case CategoryEnum.genre: { + this.categories.genre = categ; break; } case CategoryEnum.handicaps: { diff --git a/src/app/models/personalOffer.model.ts b/src/app/models/personalOffer.model.ts index 3d830779c..e456b40dc 100644 --- a/src/app/models/personalOffer.model.ts +++ b/src/app/models/personalOffer.model.ts @@ -14,7 +14,7 @@ export class PersonalOffer { labelsQualifications: obj?.categories?.labelsQualifications || [], languageAndIlliteracy: obj?.categories?.languageAndIlliteracy || [], onlineProcedures: obj?.categories?.onlineProcedures || [], - publicOthers: obj?.categories?.publicOthers || [], + genre: obj?.categories?.genre || [], }, }); } diff --git a/src/app/models/structure.model.ts b/src/app/models/structure.model.ts index 4d0e65207..6f0ccefc2 100644 --- a/src/app/models/structure.model.ts +++ b/src/app/models/structure.model.ts @@ -73,7 +73,7 @@ export class Structure { labelsQualifications: obj?.categories?.labelsQualifications || [], languageAndIlliteracy: obj?.categories?.languageAndIlliteracy || [], onlineProcedures: obj?.categories?.onlineProcedures || [], - publicOthers: obj?.categories?.publicOthers || [], + genre: obj?.categories?.genre || [], selfServiceMaterial: obj?.categories?.selfServiceMaterial || [], solidarityMaterial: obj?.categories?.solidarityMaterial || [], }, diff --git a/src/app/profile/structure-edition-summary/structure-edition-summary.component.html b/src/app/profile/structure-edition-summary/structure-edition-summary.component.html index 081a360c3..7898b2331 100644 --- a/src/app/profile/structure-edition-summary/structure-edition-summary.component.html +++ b/src/app/profile/structure-edition-summary/structure-edition-summary.component.html @@ -355,12 +355,10 @@ <div class="content"> <ng-container *ngIf=" - isFieldValid('publicOthers', 'categories') && - structure.categoriesDisplay && - structure.categoriesDisplay.publicOthers + isFieldValid('genre', 'categories') && structure.categoriesDisplay && structure.categoriesDisplay.genre " > - <div *ngFor="let public of structure.categoriesDisplay.publicOthers" class="list"> + <div *ngFor="let public of structure.categoriesDisplay.genre" class="list"> <p>{{ public }}</p> </div> </ng-container> @@ -369,7 +367,7 @@ <ng-container *ngIf=" structure.categoriesDisplay.languageAndIlliteracy.length === 0 && - structure.categoriesDisplay.publicOthers.length === 0 && + structure.categoriesDisplay.genre.length === 0 && structure.categoriesDisplay.handicaps.length === 0 " > diff --git a/src/app/shared/enum/category.enum.ts b/src/app/shared/enum/category.enum.ts index 2efdafe76..e6f7a57ce 100644 --- a/src/app/shared/enum/category.enum.ts +++ b/src/app/shared/enum/category.enum.ts @@ -9,5 +9,5 @@ export enum CategoryEnum { age = 'age', languageAndIlliteracy = 'languageAndIlliteracy', handicaps = 'handicaps', - publicOthers = 'publicOthers', + genre = 'genre', } 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..119853219 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 @@ -279,11 +279,11 @@ </p> </div> <div - *ngIf="structure.categoriesDisplay.publicOthers && structure.categoriesDisplay.publicOthers.length" + *ngIf="structure.categoriesDisplay.genre && structure.categoriesDisplay.genre.length" fxLayout="column" fxLayoutGap="8px" > - <p *ngFor="let label of structure.categoriesDisplay.publicOthers.sort()" class="no-margin-bottom"> + <p *ngFor="let label of structure.categoriesDisplay.genre.sort()" class="no-margin-bottom"> {{ label }} </p> </div> diff --git a/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts b/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts index e5aa63ebc..61b960f3e 100644 --- a/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts +++ b/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts @@ -154,7 +154,7 @@ export class StructureListSearchComponent implements OnInit { module.name === 'age' || module.name === 'languageAndIlliteracy' || module.name === 'handicaps' || - module.name === 'publicOthers' + module.name === 'genre' ).length; this.numberEquipmentChecked = checkedModules.filter( (module) => module.name === 'solidarityMaterial' || module.name === 'selfServiceMaterial' diff --git a/src/app/structure-list/enum/public.enum.ts b/src/app/structure-list/enum/public.enum.ts index 6ee5e79fd..f99b7d044 100644 --- a/src/app/structure-list/enum/public.enum.ts +++ b/src/app/structure-list/enum/public.enum.ts @@ -2,5 +2,5 @@ export enum PublicCategorie { age = 'age', handicaps = 'handicaps', languageAndIlliteracy = 'languageAndIlliteracy', - other = 'publicOthers', + other = 'genre', } diff --git a/src/app/utils/formUtils.ts b/src/app/utils/formUtils.ts index 0061edd0c..700bfca13 100644 --- a/src/app/utils/formUtils.ts +++ b/src/app/utils/formUtils.ts @@ -123,7 +123,7 @@ export class formUtils { age: this.loadArrayForCheckbox(structure.categories?.age, true), languageAndIlliteracy: this.loadArrayForCheckbox(structure.categories?.languageAndIlliteracy, false), selfServiceMaterial: this.loadArrayForCheckbox(structure.categories?.selfServiceMaterial, false), - publicOthers: this.loadArrayForCheckbox(structure.categories?.publicOthers, false), + genre: this.loadArrayForCheckbox(structure.categories?.genre, false), baseSkills: new UntypedFormControl(structure.categories?.baseSkills), advancedSkills: new UntypedFormControl(structure.categories?.advancedSkills), solidarityMaterial: this.loadArrayForCheckbox(structure.categories?.solidarityMaterial, false), diff --git a/src/app/utils/orientationUtils.ts b/src/app/utils/orientationUtils.ts index 96dac5eda..881ee4c6f 100644 --- a/src/app/utils/orientationUtils.ts +++ b/src/app/utils/orientationUtils.ts @@ -118,7 +118,7 @@ export class OrientationUtils { { age: new UntypedFormArray([], Validators.required), languageAndIlliteracy: new UntypedFormArray([]), - publicOthers: new UntypedFormArray([]), + genre: new UntypedFormArray([]), handicaps: new UntypedFormArray([]), }, Validators.required -- GitLab From 7a36036fd063f46b4d37a949dd95e2fd60ac155d Mon Sep 17 00:00:00 2001 From: Marlene Simondant <msimondant@grandlyon.com> Date: Thu, 6 Apr 2023 11:19:16 +0200 Subject: [PATCH 12/47] refactor: remove aptic --- src/app/structure-list/models/category.model.ts | 2 +- src/app/structure-list/models/module.model.ts | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/app/structure-list/models/category.model.ts b/src/app/structure-list/models/category.model.ts index 42c2d77e3..1bef26f77 100644 --- a/src/app/structure-list/models/category.model.ts +++ b/src/app/structure-list/models/category.model.ts @@ -10,7 +10,7 @@ export class Category { Object.assign(this, obj, { modules: obj && obj.modules - ? obj.modules.map((module: Module) => new Module(module.id, module.name, module.displayText, module.apticIds)) + ? obj.modules.map((module: Module) => new Module(module.id, module.name, module.displayText)) : null, }); } diff --git a/src/app/structure-list/models/module.model.ts b/src/app/structure-list/models/module.model.ts index ec92c00a1..870ffaee2 100644 --- a/src/app/structure-list/models/module.model.ts +++ b/src/app/structure-list/models/module.model.ts @@ -2,12 +2,10 @@ export class Module { id: string; name: string; displayText?: string; - apticIds?: string[]; - constructor(id: string, name: string, displayText?: string, apticIds?: string[]) { + constructor(id: string, name: string, displayText?: string) { this.id = id; this.name = name; this.displayText = displayText || name; - this.apticIds = apticIds; } } -- GitLab From 197123f5698a495c1a7a34fc848a7e784ee531c2 Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Thu, 6 Apr 2023 10:41:54 +0000 Subject: [PATCH 13/47] feat(admin): restore deleted structure --- .../deleted-structures.component.html | 1 - .../deleted-structures.component.ts | 18 +++++++++++++++++ .../admin-structures-list.component.ts | 20 +++++++++---------- .../models/adminStructureList.interface.ts | 13 ++++++++++++ src/app/admin/services/admin.service.ts | 13 ++++++------ 5 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 src/app/admin/models/adminStructureList.interface.ts diff --git a/src/app/admin/components/deleted-structures/deleted-structures.component.html b/src/app/admin/components/deleted-structures/deleted-structures.component.html index ef140d887..e4b520515 100644 --- a/src/app/admin/components/deleted-structures/deleted-structures.component.html +++ b/src/app/admin/components/deleted-structures/deleted-structures.component.html @@ -3,7 +3,6 @@ </div> <div *ngIf="!isLoading" class="deletedStructures"> <h2>Liste des structures supprimées</h2> - <ag-grid-angular *ngIf="deletedStructures" class="ag-theme-alpine" diff --git a/src/app/admin/components/deleted-structures/deleted-structures.component.ts b/src/app/admin/components/deleted-structures/deleted-structures.component.ts index 6b48ced90..2c3e281cf 100644 --- a/src/app/admin/components/deleted-structures/deleted-structures.component.ts +++ b/src/app/admin/components/deleted-structures/deleted-structures.component.ts @@ -18,6 +18,10 @@ export class DeletedStructuresComponent implements OnInit { constructor(private adminService: AdminService, private datePipe: DatePipe) {} ngOnInit(): void { + this.loadDeletedStructures(); + } + + private loadDeletedStructures(): void { this.adminService .getDeletedStructures() .pipe(finalize(() => (this.isLoading = false))) @@ -30,6 +34,13 @@ export class DeletedStructuresComponent implements OnInit { return `<a href="/acteurs?id=${structure._id}" target="_blank">${structure.structureName}</a>`; } + private restoreStructure(structureId: string): void { + this.adminService.restoreDeletedStructure(structureId).subscribe(() => { + this.isLoading = true; + this.loadDeletedStructures(); + }); + } + public columnDefs: ColDef<Structure>[] = [ { headerName: 'Structure', @@ -53,5 +64,12 @@ export class DeletedStructuresComponent implements OnInit { sort: 'desc', valueFormatter: (params) => this.datePipe.transform(params.value, 'yyyy-MM-dd'), }, + { + headerName: 'Restaurer', + cellRenderer: () => '<button type="button">Restaurer</button>', + onCellClicked: (params) => { + this.restoreStructure(params.data._id); + }, + }, ]; } diff --git a/src/app/admin/components/structures-list/admin-structures-list.component.ts b/src/app/admin/components/structures-list/admin-structures-list.component.ts index fe80c1047..3127ba460 100644 --- a/src/app/admin/components/structures-list/admin-structures-list.component.ts +++ b/src/app/admin/components/structures-list/admin-structures-list.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { finalize } from 'rxjs/operators'; -import { StructureAdminInfo } from '../../models/demandAttachment.model'; +import { AdminStructure } from '../../models/adminStructureList.interface'; import { AdminService } from '../../services/admin.service'; @Component({ @@ -9,10 +9,10 @@ import { AdminService } from '../../services/admin.service'; styleUrls: ['../../admin-pannel.scss'], }) export class AdminStructuresListComponent implements OnInit { - public structuresInClaim: StructureAdminInfo[]; - public structuresToClaim: StructureAdminInfo[]; - public structuresClaimed: StructureAdminInfo[]; - public structuresIncomplete: StructureAdminInfo[]; + public structuresClaimed: AdminStructure[]; + public structuresInClaim: AdminStructure[]; + public structuresToClaim: AdminStructure[]; + public structuresIncomplete: AdminStructure[]; public isAll: boolean = false; public isLoading: boolean = true; constructor(private adminService: AdminService) {} @@ -21,11 +21,11 @@ export class AdminStructuresListComponent implements OnInit { this.adminService .getAllStructureAdmin() .pipe(finalize(() => (this.isLoading = false))) - .subscribe((structures) => { - this.structuresClaimed = structures.claimed; - this.structuresInClaim = structures.inClaim; - this.structuresToClaim = structures.toClaim; - this.structuresIncomplete = structures.incomplete; + .subscribe((response) => { + this.structuresClaimed = response.claimed; + this.structuresInClaim = response.inClaim; + this.structuresToClaim = response.toClaim; + this.structuresIncomplete = response.incomplete; }); } } diff --git a/src/app/admin/models/adminStructureList.interface.ts b/src/app/admin/models/adminStructureList.interface.ts new file mode 100644 index 000000000..9a751bbb6 --- /dev/null +++ b/src/app/admin/models/adminStructureList.interface.ts @@ -0,0 +1,13 @@ +export interface AdminStructureList { + claimed: AdminStructure[]; + inClaim: AdminStructure[]; + toClaim: AdminStructure[]; + incomplete: AdminStructure[]; +} + +export interface AdminStructure { + structureId: string; + structureName: string; + updatedAt: Date; + isOutdated: boolean; +} diff --git a/src/app/admin/services/admin.service.ts b/src/app/admin/services/admin.service.ts index b7e5e720b..bd98249d5 100644 --- a/src/app/admin/services/admin.service.ts +++ b/src/app/admin/services/admin.service.ts @@ -5,6 +5,7 @@ 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 { AdminStructureList } from '../models/adminStructureList.interface'; import { StructureAdminInfo } from '../models/demandAttachment.model'; @Injectable({ @@ -21,12 +22,8 @@ export class AdminService { return this.http.get<StructureAdminInfo[]>(`${this.baseUrl}/pendingStructures`); } - public getToClaimStructure(): Observable<StructureAdminInfo[]> { - return this.http.get<StructureAdminInfo[]>(`${this.baseUrl}/unclaimedStructures`); - } - - public getAllStructureAdmin(): Observable<any> { - return this.http.get<StructureAdminInfo[]>(`${this.baseUrl}/adminStructuresList`); + public getAllStructureAdmin(): Observable<AdminStructureList> { + return this.http.get<AdminStructureList>(`${this.baseUrl}/adminStructuresList`); } public getUsers(): Observable<User[]> { @@ -173,4 +170,8 @@ export class AdminService { public getDeletedStructures(): Observable<Structure[]> { return this.http.get<Structure[]>(`${this.baseUrl}/getDeletedStructures`); } + + public restoreDeletedStructure(structureId: string): Observable<void> { + return this.http.post<void>(`${this.baseUrl}/restoreDeletedStructure/${structureId}`, {}); + } } -- GitLab From e7d8c2f9c51c8d2ca6f701bd113cfe0a7312c439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marl=C3=A8ne=20SIMONDANT?= <msimondant@grandlyon.com> Date: Fri, 7 Apr 2023 08:50:27 +0000 Subject: [PATCH 14/47] feat(posts&pages): apply ghost styling --- angular.json | 4 +- src/app/page/page.component.ts | 21 +- .../post-details/post-details.component.ts | 13 +- src/assets/ghost/cards.min.css | 1 + src/assets/ghost/cards.min.js | 1 + src/assets/scss/_ghost.scss | 211 +----------------- 6 files changed, 34 insertions(+), 217 deletions(-) create mode 100644 src/assets/ghost/cards.min.css create mode 100644 src/assets/ghost/cards.min.js diff --git a/angular.json b/angular.json index 5b36cae18..a4f73808c 100644 --- a/angular.json +++ b/angular.json @@ -84,8 +84,8 @@ }, { "type": "anyComponentStyle", - "maximumWarning": "10kb", - "maximumError": "15kb" + "maximumWarning": "30kb", + "maximumError": "35kb" } ], "serviceWorker": true, diff --git a/src/app/page/page.component.ts b/src/app/page/page.component.ts index 7a4f4f7b5..990875565 100644 --- a/src/app/page/page.component.ts +++ b/src/app/page/page.component.ts @@ -1,30 +1,37 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { Component, ElementRef, OnInit, Renderer2, ViewEncapsulation } from '@angular/core'; import { DomSanitizer, Meta } from '@angular/platform-browser'; +import { ActivatedRoute } from '@angular/router'; import packageJson from '../../../package.json'; +import { PageEnum } from './enum/page.enum'; import { Page } from './models/page.model'; import { PageService } from './services/page.service'; -import { PageEnum } from './enum/page.enum'; @Component({ selector: 'app-page', templateUrl: './page.component.html', - styleUrls: ['./page.component.scss'], + styleUrls: ['./page.component.scss', '../../assets/ghost/cards.min.css'], + encapsulation: ViewEncapsulation.None, }) export class PageComponent implements OnInit { public page: Page; public version: string; private slugPage: string; - private quiSommesNous = PageEnum.quiSommesNous; constructor( private sanitizer: DomSanitizer, private route: ActivatedRoute, private pageService: PageService, - private meta: Meta + private meta: Meta, + private readonly elementRef: ElementRef, + private renderer: Renderer2 ) {} ngOnInit(): void { + // add ghost JS + const script = this.renderer.createElement('script'); + script.src = '/assets/ghost/cards.min.js'; + this.renderer.appendChild(this.elementRef.nativeElement, script); + this.route.params.subscribe((routeParams) => { this.slugPage = routeParams.slugPage; this.pageService.getPage(this.slugPage).subscribe((page) => { @@ -36,7 +43,7 @@ export class PageComponent implements OnInit { }); }); // Display version number in 'About' page only - this.slugPage == this.quiSommesNous ? (this.version = packageJson.version) : (this.version = ''); + this.version = this.slugPage == PageEnum.quiSommesNous ? packageJson.version : ''; }); } } diff --git a/src/app/post/components/post-details/post-details.component.ts b/src/app/post/components/post-details/post-details.component.ts index f42eaa73b..9a5301245 100644 --- a/src/app/post/components/post-details/post-details.component.ts +++ b/src/app/post/components/post-details/post-details.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, ElementRef, OnInit, Renderer2, ViewEncapsulation } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { ActivatedRoute } from '@angular/router'; import { RouterListenerService } from '../../../services/routerListener.service'; @@ -8,7 +8,8 @@ import { PostService } from '../../services/post.service'; @Component({ selector: 'app-post-details', templateUrl: './post-details.component.html', - styleUrls: ['./post-details.component.scss'], + styleUrls: ['./post-details.component.scss', '../../../../assets/ghost/cards.min.css'], + encapsulation: ViewEncapsulation.None, }) export class PostDetailsComponent implements OnInit { public post: Post; @@ -17,7 +18,9 @@ export class PostDetailsComponent implements OnInit { private activatedRoute: ActivatedRoute, private postService: PostService, private sanitizer: DomSanitizer, - private routerListener: RouterListenerService + private routerListener: RouterListenerService, + private readonly elementRef: ElementRef, + private renderer: Renderer2 ) {} ngOnInit(): void { @@ -31,6 +34,10 @@ export class PostDetailsComponent implements OnInit { this.post.safeHtml = this.sanitizer.bypassSecurityTrustHtml(this.post.html); }); } + // add ghost JS + const script = this.renderer.createElement('script'); + script.src = '/assets/ghost/cards.min.js'; + this.renderer.appendChild(this.elementRef.nativeElement, script); } public backToPosts(): void { diff --git a/src/assets/ghost/cards.min.css b/src/assets/ghost/cards.min.css new file mode 100644 index 000000000..6ab2823e0 --- /dev/null +++ b/src/assets/ghost/cards.min.css @@ -0,0 +1 @@ +.kg-audio-card,.kg-audio-card *{box-sizing:border-box}.kg-audio-card{display:flex;width:100%;min-height:96px;border-radius:3px;box-shadow:inset 0 0 0 1px rgba(124,139,154,.25)}.kg-audio-card+.kg-audio-card{margin-top:1em}.kg-audio-thumbnail{display:flex;justify-content:center;align-items:center;width:80px;min-width:80px;margin:8px;background:0 0;object-fit:cover;aspect-ratio:1/1;border-radius:2px}.kg-audio-thumbnail.placeholder{background:var(--ghost-accent-color)}.kg-audio-thumbnail.placeholder svg{width:24px;height:24px;fill:#fff}.kg-audio-player-container{position:relative;display:flex;flex-direction:column;justify-content:space-between;width:100%;--seek-before-width:0%;--volume-before-width:100%;--buffered-width:0%}.kg-audio-title{width:100%;margin:8px 0 0;padding:8px 12px;border:0;font-family:inherit;font-size:1.15em;font-weight:700;line-height:1.15em;background:0 0}.kg-audio-player{display:flex;flex-grow:1;align-items:center;padding:8px 12px}.kg-audio-current-time,.kg-audio-time{font-family:inherit;font-size:.85em;font-weight:500;line-height:1.4em;white-space:nowrap}.kg-audio-current-time{min-width:38px;padding:0 4px}.kg-audio-time{width:56px;color:#ababab}.kg-audio-duration{padding:0 4px}.kg-audio-pause-icon,.kg-audio-play-icon{position:relative;bottom:1px;padding:0 4px 0 0;font-size:0;background:0 0}.kg-audio-hide{display:none!important}.kg-audio-pause-icon svg,.kg-audio-play-icon svg{width:14px;height:14px;fill:currentColor}.kg-audio-seek-slider{flex-grow:1;margin:0 4px}@media (max-width:640px){.kg-audio-seek-slider{display:none}}.kg-audio-playback-rate{min-width:37px;padding:0 4px;font-family:inherit;font-size:.85em;font-weight:600;line-height:1.4em;text-align:left;background:0 0;white-space:nowrap}@media (max-width:640px){.kg-audio-playback-rate{padding-left:8px}}.kg-audio-mute-icon,.kg-audio-unmute-icon{position:relative;bottom:-1px;padding:0 4px;font-size:0;background:0 0}@media (max-width:640px){.kg-audio-mute-icon,.kg-audio-unmute-icon{margin-left:auto}}.kg-audio-mute-icon svg,.kg-audio-unmute-icon svg{width:16px;height:16px;fill:currentColor}.kg-audio-volume-slider{width:80px}@media (max-width:400px){.kg-audio-volume-slider{display:none}}.kg-audio-seek-slider::before,.kg-audio-volume-slider::before{content:"";position:absolute;left:0;width:var(--seek-before-width)!important;height:4px;cursor:pointer;background-color:currentColor;border-radius:2px}.kg-audio-volume-slider::before{width:var(--volume-before-width)!important}.kg-audio-player-container input[type=range]{position:relative;-webkit-appearance:none;background:0 0;height:auto;padding:0;border:0}.kg-audio-player-container input[type=range]:focus,.kg-video-card input[type=range]:focus{outline:0}.kg-audio-player-container input[type=range]::-webkit-slider-thumb{-webkit-appearance:none}.kg-audio-player-container button,.kg-video-card button{display:flex;align-items:center;border:0;cursor:pointer}.kg-audio-player-container input[type=range]::-webkit-slider-runnable-track{width:100%;height:4px;cursor:pointer;background:rgba(124,139,154,.25);border-radius:2px}.kg-audio-player-container input[type=range]::-webkit-slider-thumb{position:relative;box-sizing:content-box;width:13px;height:13px;margin:-5px 0 0;border:0;cursor:pointer;background:#fff;border-radius:50%;box-shadow:0 0 0 1px rgba(0,0,0,.08),0 1px 4px rgba(0,0,0,.24)}.kg-audio-player-container input[type=range]:active::-webkit-slider-thumb{transform:scale(1.2)}.kg-audio-player-container input[type=range]::-moz-range-track{width:100%;height:4px;cursor:pointer;background:rgba(124,139,154,.25);border-radius:2px}.kg-audio-player-container input[type=range]::-moz-range-progress{background:currentColor;border-radius:2px}.kg-audio-player-container input[type=range]::-moz-range-thumb{box-sizing:content-box;width:13px;height:13px;border:0;cursor:pointer;background:#fff;border-radius:50%;box-shadow:0 0 0 1px rgba(0,0,0,.08),0 1px 4px rgba(0,0,0,.24)}.kg-audio-player-container input[type=range]:active::-moz-range-thumb{transform:scale(1.2)}.kg-audio-player-container input[type=range]::-ms-track{width:100%;height:3px;border:solid transparent;color:transparent;cursor:pointer;background:0 0}.kg-audio-player-container input[type=range]::-ms-fill-lower{background:#fff}.kg-audio-player-container input[type=range]::-ms-fill-upper{background:currentColor}.kg-audio-player-container input[type=range]::-ms-thumb{box-sizing:content-box;width:13px;height:13px;border:0;cursor:pointer;background:#fff;border-radius:50%;box-shadow:0 0 0 1px rgba(0,0,0,.08),0 1px 4px rgba(0,0,0,.24)}.kg-audio-player-container input[type=range]:active::-ms-thumb{transform:scale(1.2)}.kg-before-after-card>div{position:relative;margin:0 auto}.kg-before-after-card-image-before{position:absolute;overflow:hidden;top:0;left:0;height:100%}.kg-before-after-card .kg-before-after-card-image-after img{width:100%}.kg-before-after-card .kg-before-after-card-image-before img{max-width:none;object-fit:cover}.kg-before-after-card input{position:absolute;top:0;-webkit-appearance:none;appearance:none;width:100%;height:100%;background:0 0;outline:0;margin:0}.kg-before-after-card input::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:5px;height:100%;background:#fff;cursor:pointer}.kg-before-after-card input::-moz-range-thumb{width:5px;height:100%;background:#fff;cursor:pointer}.kg-before-after-card-slider-handle{pointer-events:none;position:absolute;width:30px;height:30px;border-radius:50%;background-color:#fff;left:calc(50% - 18px);top:calc(50% - 18px);display:flex;justify-content:center;align-items:center}.kg-before-after-card-slider-handle:after,.kg-before-after-card-slider-handle:before{transform:rotate(-45deg);content:'';padding:3px;display:inline-block;border:solid #5d5d5d;border-width:0 2px 2px 0}.kg-before-after-card-slider-handle:before{transform:rotate(135deg)}.kg-blockquote-alt{font-size:1.5em;font-style:italic;line-height:1.7em;text-align:center;padding:0 2.5em}@media (max-width:800px){.kg-blockquote-alt{font-size:1.4em;padding-left:2em;padding-right:2em}}@media (max-width:600px){.kg-blockquote-alt{font-size:1.2em;padding-left:1.75em;padding-right:1.75em}}.kg-bookmark-card,.kg-bookmark-card *{box-sizing:border-box}.kg-bookmark-card,.kg-bookmark-publisher{position:relative;width:100%}.kg-bookmark-card a.kg-bookmark-container,.kg-bookmark-card a.kg-bookmark-container:hover{display:flex;text-decoration:none;border-radius:3px;border:1px solid rgb(124 139 154/25%);overflow:hidden;color:inherit}.kg-bookmark-content{display:flex;flex-direction:column;flex-grow:1;flex-basis:100%;align-items:flex-start;justify-content:flex-start;padding:20px;overflow:hidden}.kg-bookmark-title{font-size:1.5rem;line-height:1.4em;font-weight:600}.kg-bookmark-description{display:-webkit-box;font-size:1.4rem;line-height:1.5em;margin-top:3px;font-weight:400;max-height:44px;overflow-y:hidden;opacity:.7;-webkit-line-clamp:2;-webkit-box-orient:vertical}.kg-bookmark-metadata{display:flex;align-items:center;margin-top:22px;width:100%;font-size:1.4rem;font-weight:500;white-space:nowrap}.kg-bookmark-metadata>:not(img){opacity:.7}.kg-bookmark-icon{width:20px;height:20px;margin-right:6px}.kg-bookmark-author{display:inline}.kg-bookmark-publisher{text-overflow:ellipsis;overflow:hidden;max-width:240px;white-space:nowrap;display:block;line-height:1.65em}.kg-bookmark-metadata>span:nth-of-type(2){font-weight:400}.kg-bookmark-metadata>span:nth-of-type(2):before{content:"•";margin:0 6px}.kg-bookmark-metadata>span:last-of-type{overflow:hidden;text-overflow:ellipsis}.kg-bookmark-thumbnail{position:relative;flex-grow:1;min-width:33%}.kg-bookmark-thumbnail img{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;border-radius:0 2px 2px 0}.kg-button-card,.kg-button-card *{box-sizing:border-box}.kg-button-card,.kg-button-card a.kg-btn{display:flex;position:static;align-items:center}.kg-button-card{width:100%;justify-content:center}.kg-button-card.kg-align-left{justify-content:flex-start}.kg-button-card a.kg-btn{padding:0 1.2em;height:2.4em;line-height:1em;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:.95em;font-weight:600;text-decoration:none;border-radius:5px;transition:opacity .2s ease-in-out}.kg-button-card a.kg-btn:hover{opacity:.85}.kg-button-card a.kg-btn-accent{background-color:var(--ghost-accent-color);color:#fff}.kg-callout-card,.kg-callout-card *{box-sizing:border-box}.kg-callout-card{display:flex;padding:1.2em 1.6em;border-radius:3px}.kg-callout-card-grey{background:rgba(124,139,154,.13)}.kg-callout-card-white{background:0 0;box-shadow:inset 0 0 0 1px rgba(124,139,154,.25)}.kg-callout-card-blue{background:rgba(33,172,232,.12)}.kg-callout-card-green{background:rgba(52,183,67,.12)}.kg-callout-card-yellow{background:rgba(240,165,15,.13)}.kg-callout-card-red{background:rgba(209,46,46,.11)}.kg-callout-card-pink{background:rgba(225,71,174,.11)}.kg-callout-card-purple{background:rgba(135,85,236,.12)}.kg-callout-card-accent{background:var(--ghost-accent-color);color:#fff}.kg-callout-card.kg-callout-card-accent a{color:#fff;text-decoration:underline}.kg-callout-card div.kg-callout-emoji{padding-right:.8em;line-height:1.25em;font-size:1.15em}.kg-callout-card div.kg-callout-text{font-size:.95em;line-height:1.5em}.kg-callout-card+.kg-callout-card{margin-top:1em}.kg-file-card,.kg-file-card *{box-sizing:border-box}.kg-file-card{display:flex}.kg-file-card a.kg-file-card-container{display:flex;align-items:stretch;justify-content:space-between;color:inherit;padding:6px;min-height:92px;border:1px solid rgb(124 139 154/25%);border-radius:3px;transition:all ease-in-out .35s;text-decoration:none;width:100%}.kg-file-card a.kg-file-card-container:hover{border:1px solid rgb(124 139 154/35%)}.kg-file-card-contents{display:flex;flex-direction:column;justify-content:space-between;margin:4px 8px;width:100%}.kg-file-card-title{font-size:1.15em;font-weight:700;line-height:1.3em}.kg-file-card-caption{font-size:.95em;line-height:1.3em;opacity:.6}.kg-file-card-title+.kg-file-card-caption{margin-top:-3px}.kg-file-card-metadata{display:inline;font-size:.825em;line-height:1.3em;margin-top:2px}.kg-file-card-filename{display:inline;font-weight:500}.kg-file-card-filesize{display:inline-block;font-size:.925em;opacity:.6}.kg-file-card-filesize:before{display:inline-block;content:"\2022";margin-right:4px}.kg-file-card-icon{position:relative;display:flex;align-items:center;justify-content:center;width:80px;min-width:80px;height:100%}.kg-file-card-icon:before{position:absolute;display:block;content:"";top:0;left:0;right:0;bottom:0;background:currentColor;opacity:.06;transition:opacity ease-in-out .35s;border-radius:2px}.kg-file-card a.kg-file-card-container:hover .kg-file-card-icon:before{opacity:.08}.kg-file-card-icon svg{width:24px;height:24px;color:var(--ghost-accent-color)}.kg-file-card-medium a.kg-file-card-container{min-height:72px}.kg-file-card-medium .kg-file-card-caption{opacity:1;font-weight:500}.kg-file-card-small a.kg-file-card-container{align-items:center;min-height:52px}.kg-file-card-small .kg-file-card-metadata{font-size:1em;margin-top:0}.kg-file-card-small .kg-file-card-icon svg{width:20px;height:20px}.kg-file-card+.kg-file-card{margin-top:1em}.kg-gallery-card,.kg-gallery-card *{box-sizing:border-box}.kg-gallery-card,.kg-image-card{--gap:1.2rem}.kg-gallery-card:not(.kg-card-hascaption)+.kg-gallery-card,.kg-gallery-card:not(.kg-card-hascaption)+.kg-image-card,.kg-image-card:not(.kg-card-hascaption)+.kg-gallery-card,.kg-image-card:not(.kg-card-hascaption)+.kg-image-card{margin-top:var(--gap)}.kg-gallery-container{position:relative}.kg-gallery-row{display:flex;flex-direction:row;justify-content:center}.kg-gallery-image img{display:block;margin:0;width:100%;height:100%}.kg-gallery-row:not(:first-of-type){margin:var(--gap) 0 0}.kg-gallery-image:not(:first-of-type){margin:0 0 0 var(--gap)}@media (max-width:600px){.kg-gallery-card,.kg-image-card{--gap:0.6rem}}.kg-header-card,.kg-header-card *{box-sizing:border-box}.kg-header-card{padding:12vmin 4em;min-height:60vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}.kg-header-card.kg-size-small{padding-top:14vmin;padding-bottom:14vmin;min-height:40vh}.kg-header-card.kg-size-large{padding-top:18vmin;padding-bottom:18vmin;min-height:80vh}.kg-header-card.kg-align-left{text-align:left;align-items:flex-start}.kg-header-card.kg-style-dark{background:#151515;color:#fff}.kg-header-card.kg-style-light{background-color:#fafafa}.kg-header-card.kg-style-accent{background-color:var(--ghost-accent-color)}.kg-header-card.kg-style-image{position:relative;background-color:#e7e7e7;background-size:cover;background-position:center}.kg-header-card.kg-style-image::before{position:absolute;display:block;content:"";top:0;right:0;bottom:0;left:0;background:linear-gradient(0deg,transparent,rgba(0,0,0,.2))}.kg-header-card h2.kg-header-card-header{font-size:5em;font-weight:700;line-height:1.1em;letter-spacing:-.01em;margin:0}.kg-header-card h2.kg-header-card-header strong{font-weight:800}.kg-header-card.kg-size-small h2.kg-header-card-header{font-size:4em}.kg-header-card.kg-size-large h2.kg-header-card-header{font-size:6em}.kg-header-card h3.kg-header-card-subheader{font-size:1.5em;font-weight:500;line-height:1.4em;margin:0;max-width:40em}.kg-header-card h2+h3.kg-header-card-subheader{margin:.35em 0 0}.kg-header-card h3.kg-header-card-subheader strong{font-weight:600}.kg-header-card.kg-size-small h3.kg-header-card-subheader{font-size:1.25em}.kg-header-card.kg-size-large h3.kg-header-card-subheader{font-size:1.75em}.kg-header-card:not(.kg-style-light) h2.kg-header-card-header,.kg-header-card:not(.kg-style-light) h3.kg-header-card-subheader{color:#fff}.kg-header-card.kg-style-accent h3.kg-header-card-subheader,.kg-header-card.kg-style-image h3.kg-header-card-subheader,.kg-product-card-rating-active.kg-product-card-rating-star svg{opacity:1}.kg-header-card.kg-style-image a.kg-header-card-button,.kg-header-card.kg-style-image h2.kg-header-card-header,.kg-header-card.kg-style-image h3.kg-header-card-subheader{z-index:999}.kg-header-card h2.kg-header-card-header a,.kg-header-card h3.kg-header-card-subheader a{color:var(--ghost-accent-color)}.kg-header-card.kg-style-accent h2.kg-header-card-header a,.kg-header-card.kg-style-accent h3.kg-header-card-subheader a,.kg-header-card.kg-style-image h2.kg-header-card-header a,.kg-header-card.kg-style-image h3.kg-header-card-subheader a{color:#fff}.kg-header-card a.kg-header-card-button{display:flex;position:static;align-items:center;fill:#fff;background:#fff;border-radius:3px;outline:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:1.05em;font-weight:600;line-height:1em;text-align:center;text-decoration:none;letter-spacing:.2px;white-space:nowrap;text-overflow:ellipsis;color:#151515;height:2.7em;padding:0 1.2em;transition:opacity .2s ease}.kg-header-card h2+a.kg-header-card-button,.kg-header-card h3+a.kg-header-card-button{margin:1.75em 0 0}.kg-header-card a.kg-header-card-button:hover{opacity:.85}.kg-header-card.kg-size-large a.kg-header-card-button{font-size:1.1em;height:2.9em}.kg-header-card.kg-size-large h2+a.kg-header-card-button,.kg-header-card.kg-size-large h3+a.kg-header-card-button{margin-top:2em}.kg-header-card.kg-size-small a.kg-header-card-button{height:2.4em;font-size:1em}.kg-header-card.kg-size-small h2+a.kg-header-card-button,.kg-header-card.kg-size-small h3+a.kg-header-card-button{margin-top:1.5em}.kg-header-card.kg-style-dark a.kg-header-card-button,.kg-header-card.kg-style-image a.kg-header-card-button{background:#fff;color:#151515}.kg-header-card.kg-style-light a.kg-header-card-button{background:var(--ghost-accent-color);color:#fff}.kg-header-card.kg-style-accent a.kg-header-card-button{background:#fff;color:#151515}@media (max-width:640px){.kg-header-card{padding-left:1em;padding-right:1em}.kg-header-card h2.kg-header-card-header{font-size:3.5em}.kg-header-card.kg-size-large h2.kg-header-card-header{font-size:4em}.kg-header-card.kg-size-small h2.kg-header-card-header{font-size:3em}.kg-header-card h3.kg-header-card-subheader{font-size:1.25em}.kg-header-card.kg-size-large h3.kg-header-card-subheader{font-size:1.5em}.kg-header-card.kg-size-small h3.kg-header-card-subheader{font-size:1em}}.kg-nft-card,.kg-nft-card *{box-sizing:border-box}.kg-nft-card{display:flex;flex-direction:column;align-items:center;width:100%;margin-left:auto;margin-right:auto}.kg-nft-card a.kg-nft-card-container{position:static;display:flex;flex:auto;flex-direction:column;text-decoration:none;font-family:-apple-system,BlinkMacSystemFont,'avenir next',avenir,'helvetica neue',helvetica,ubuntu,roboto,noto,'segoe ui',arial,sans-serif;font-size:14px;font-weight:400;box-shadow:0 2px 6px -2px rgb(0 0 0/10%),0 0 1px rgb(0 0 0/40%);width:100%;max-width:512px;color:#222;background:#fff;border-radius:5px;transition:none}.kg-nft-card *{position:static}.kg-nft-metadata{padding:20px;width:100%}.kg-nft-image{border-radius:5px 5px 0 0;width:100%}.kg-nft-header{display:flex;justify-content:space-between;align-items:flex-start;gap:20px}.kg-nft-header h4.kg-nft-title{font-family:inherit;font-size:19px;font-weight:700;line-height:1.3em;min-width:unset;max-width:unset;margin:0;color:#222}.kg-nft-opensea-logo{margin-top:2px;width:100px;object-fit:scale-down}.kg-nft-card p.kg-nft-description,.kg-nft-creator{font-family:inherit;line-height:1.4em;margin:4px 0 0;color:#ababab}.kg-nft-creator span{font-weight:500;color:#222}.kg-nft-card p.kg-nft-description{font-size:14px;margin:20px 0 0;color:#222}.kg-product-card,.kg-product-card *{box-sizing:border-box}.kg-product-card{display:flex;align-items:center;flex-direction:column;width:100%}.kg-product-card-container{display:grid;grid-template-columns:auto min-content;align-items:center;grid-row-gap:16px;background:0 0;max-width:550px;padding:20px;width:100%;border-radius:5px;box-shadow:inset 0 0 0 1px rgb(124 139 154/25%)}.kg-product-card-image{grid-column:1/3;justify-self:center}.kg-product-card-title-container{grid-column:1/2}.kg-product-card h4.kg-product-card-title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;text-decoration:none;font-weight:700;font-size:1.4em;margin-top:0;margin-bottom:0;line-height:1.15em}.kg-product-card-description{grid-column:1/3}.kg-product-card .kg-product-card-description ol,.kg-product-card .kg-product-card-description p,.kg-product-card .kg-product-card-description ul{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:.95em;line-height:1.5em;opacity:.7;margin-bottom:0}.kg-product-card .kg-product-card-description p:first-of-type{margin-top:-4px}.kg-product-card .kg-product-card-description ol,.kg-product-card .kg-product-card-description p:not(:first-of-type),.kg-product-card .kg-product-card-description ul{margin-top:.95em}.kg-product-card .kg-product-card-description li+li,.kg-toggle-card li+li{margin-top:.5em}.kg-product-card-rating{display:flex;align-items:center;grid-column:2/3;align-self:start;justify-self:end;padding-left:16px}@media (max-width:400px){.kg-product-card-title-container{grid-column:1/3}.kg-product-card-rating{grid-column:1/3;justify-self:start;margin-top:-15px;padding-left:0}}.kg-product-card-rating-star{height:28px;width:20px}.kg-product-card-rating-star svg{width:16px;height:16px;fill:currentColor;opacity:.15}.kg-product-card a.kg-product-card-button{justify-content:center;grid-column:1/3;display:flex;position:static;align-items:center;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:.95em;font-weight:600;line-height:1em;text-decoration:none;width:100%;height:2.4em;border-radius:5px;padding:0 1.2em;transition:opacity .2s ease-in-out}.kg-product-card a.kg-product-card-btn-accent{background-color:var(--ghost-accent-color);color:#fff}.kg-toggle-card,.kg-toggle-card *{box-sizing:border-box}.kg-toggle-card{background:0 0;box-shadow:inset 0 0 0 1px rgba(124,139,154,.25);border-radius:4px;padding:1.2em}.kg-toggle-card[data-kg-toggle-state=close] .kg-toggle-content{height:0;overflow:hidden;transition:opacity .5s ease,top .35s ease;opacity:0;top:-.5em;position:relative}.kg-toggle-content{height:auto;opacity:1;transition:opacity 1s ease,top .35s ease;top:0;position:relative}.kg-toggle-card[data-kg-toggle-state=close] svg{transform:unset}.kg-toggle-heading{cursor:pointer;display:flex;justify-content:space-between;align-items:flex-start}.kg-toggle-card h4.kg-toggle-heading-text{font-size:1.15em;font-weight:700;line-height:1.3em;margin-top:0;margin-bottom:0}.kg-toggle-content p:first-of-type{margin-top:.5em}.kg-toggle-card .kg-toggle-content ol,.kg-toggle-card .kg-toggle-content p,.kg-toggle-card .kg-toggle-content ul{font-size:.95em;line-height:1.5em;margin-top:.95em;margin-bottom:0}.kg-toggle-card-icon{height:24px;width:24px;display:flex;justify-content:center;align-items:center;margin-left:1em;background:0 0;border:0}.kg-toggle-heading svg{width:14px;color:rgba(124,139,154,.5);transition:all .3s;transform:rotate(-180deg)}.kg-toggle-heading path{fill:none;stroke:currentcolor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5;fill-rule:evenodd}.kg-toggle-card+.kg-toggle-card{margin-top:1em}.kg-video-card,.kg-video-card *{box-sizing:border-box}.kg-video-card{position:relative;--seek-before-width:0%;--volume-before-width:100%;--buffered-width:0%}.kg-video-card video{display:block;max-width:100%;height:auto}.kg-video-container{position:relative;display:flex;flex-direction:column;align-items:center}.kg-video-large-play-icon,.kg-video-overlay{display:flex;justify-content:center;align-items:center;transition:opacity .2s ease-in-out}.kg-video-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background-image:linear-gradient(180deg,rgba(0,0,0,.3) 0,transparent 70%,transparent 100%);z-index:999}.kg-video-large-play-icon{width:72px;height:72px;padding:0;background:rgba(0,0,0,.5);border-radius:50%}.kg-video-large-play-icon svg{width:20px;height:auto;margin-left:2px;fill:#fff}.kg-video-player-container{position:absolute;bottom:0;width:100%;height:80px;background:linear-gradient(transparent,rgba(0,0,0,.5));z-index:999;transition:opacity .2s ease-in-out}.kg-video-player{position:absolute;bottom:0;display:flex;align-items:center;width:100%;z-index:9999;padding:12px 16px}.kg-video-current-time,.kg-video-time{font-family:inherit;font-size:.85em;font-weight:500;line-height:1.4em;white-space:nowrap}.kg-video-current-time{min-width:38px;padding:0 4px;color:#fff}.kg-video-time{color:rgba(255,255,255,.6)}.kg-video-duration{padding:0 4px}.kg-video-pause-icon,.kg-video-play-icon{position:relative;padding:0 4px 0 0;font-size:0;background:0 0}.kg-video-hide{display:none!important}.kg-video-hide-animated{opacity:0!important;transition:opacity .2s ease-in-out;cursor:initial}.kg-video-pause-icon svg,.kg-video-play-icon svg{width:14px;height:14px;fill:#fff}.kg-video-seek-slider{flex-grow:1;margin:0 4px}@media (max-width:520px){.kg-video-seek-slider{display:none}}.kg-video-playback-rate{min-width:37px;padding:0 4px;color:#fff;font-family:inherit;font-size:.85em;font-weight:600;line-height:1.4em;text-align:left;background:0 0;white-space:nowrap}@media (max-width:520px){.kg-video-playback-rate{padding-left:8px}}.kg-video-mute-icon,.kg-video-unmute-icon{position:relative;bottom:-1px;padding:0 4px;font-size:0;background:0 0}@media (max-width:520px){.kg-video-mute-icon,.kg-video-unmute-icon{margin-left:auto}}.kg-video-mute-icon svg,.kg-video-unmute-icon svg{width:16px;height:16px;fill:#fff}.kg-video-volume-slider{width:80px}@media (max-width:300px){.kg-video-volume-slider{display:none}}.kg-video-seek-slider::before,.kg-video-volume-slider::before{content:"";position:absolute;left:0;width:var(--seek-before-width)!important;height:4px;cursor:pointer;background-color:#ebeef0;border-radius:2px}.kg-video-volume-slider::before{width:var(--volume-before-width)!important}.kg-video-card input[type=range]{position:relative;-webkit-appearance:none;background:0 0;height:auto;padding:0;border:0}.kg-video-card input[type=range]::-webkit-slider-thumb{-webkit-appearance:none}.kg-video-card input[type=range]::-webkit-slider-runnable-track{width:100%;height:4px;cursor:pointer;background:rgba(255,255,255,.2);border-radius:2px}.kg-video-card input[type=range]::-webkit-slider-thumb{position:relative;box-sizing:content-box;width:13px;height:13px;margin:-5px 0 0;border:0;cursor:pointer;background:#fff;border-radius:50%;box-shadow:0 0 0 1px rgba(0,0,0,.08),0 1px 4px rgba(0,0,0,.24)}.kg-video-card input[type=range]:active::-webkit-slider-thumb{transform:scale(1.2)}.kg-video-card input[type=range]::-moz-range-track{width:100%;height:4px;cursor:pointer;background:rgba(255,255,255,.2);border-radius:2px}.kg-video-card input[type=range]::-moz-range-progress{background:#ebeef0;border-radius:2px}.kg-video-card input[type=range]::-moz-range-thumb{box-sizing:content-box;width:13px;height:13px;border:0;cursor:pointer;background:#fff;border-radius:50%;box-shadow:0 0 0 1px rgba(0,0,0,.08),0 1px 4px rgba(0,0,0,.24)}.kg-video-card input[type=range]:active::-moz-range-thumb{transform:scale(1.2)}.kg-video-card input[type=range]::-ms-track{width:100%;height:3px;border:solid transparent;color:transparent;cursor:pointer;background:0 0}.kg-video-card input[type=range]::-ms-fill-lower{background:#fff}.kg-video-card input[type=range]::-ms-fill-upper{background:#ebeef0}.kg-video-card input[type=range]::-ms-thumb{box-sizing:content-box;width:13px;height:13px;border:0;cursor:pointer;background:#fff;border-radius:50%;box-shadow:0 0 0 1px rgba(0,0,0,.08),0 1px 4px rgba(0,0,0,.24)}.kg-video-card input[type=range]:active::-ms-thumb{transform:scale(1.2)} \ No newline at end of file diff --git a/src/assets/ghost/cards.min.js b/src/assets/ghost/cards.min.js new file mode 100644 index 000000000..0c8615da2 --- /dev/null +++ b/src/assets/ghost/cards.min.js @@ -0,0 +1 @@ +!function(){const e=function(e){const t=e.querySelector(".kg-audio-player-container"),a=e.querySelector(".kg-audio-play-icon"),o=e.querySelector(".kg-audio-pause-icon"),i=e.querySelector(".kg-audio-seek-slider"),r=e.querySelector(".kg-audio-playback-rate"),d=e.querySelector(".kg-audio-mute-icon"),l=e.querySelector(".kg-audio-unmute-icon"),s=e.querySelector(".kg-audio-volume-slider"),n=e.querySelector("audio"),c=e.querySelector(".kg-audio-duration"),u=e.querySelector(".kg-audio-current-time");let g=[{rate:.75,label:"0.7×"},{rate:1,label:"1×"},{rate:1.25,label:"1.2×"},{rate:1.75,label:"1.7×"},{rate:2,label:"2×"}],v=null,m=1;const k=()=>{i.value=Math.floor(n.currentTime),u.textContent=h(i.value),t.style.setProperty("--seek-before-width",i.value/i.max*100+"%"),v=requestAnimationFrame(k)},y=e=>{e===i?t.style.setProperty("--seek-before-width",e.value/e.max*100+"%"):t.style.setProperty("--volume-before-width",e.value/e.max*100+"%")},h=e=>{const t=Math.floor(e/60),a=Math.floor(e%60);return`${t}:${a<10?`0${a}`:`${a}`}`},p=()=>{c.textContent=h(n.duration)},f=()=>{i.max=Math.floor(n.duration)},L=()=>{if(n.buffered.length>0){const e=Math.floor(n.buffered.end(n.buffered.length-1));t.style.setProperty("--buffered-width",e/i.max*100+"%")}};n.readyState>0?(p(),f(),L()):n.addEventListener("loadedmetadata",(()=>{p(),f(),L()})),a.addEventListener("click",(()=>{a.classList.add("kg-audio-hide"),o.classList.remove("kg-audio-hide"),n.play(),requestAnimationFrame(k)})),o.addEventListener("click",(()=>{o.classList.add("kg-audio-hide"),a.classList.remove("kg-audio-hide"),n.pause(),cancelAnimationFrame(v)})),d.addEventListener("click",(()=>{d.classList.add("kg-audio-hide"),l.classList.remove("kg-audio-hide"),n.muted=!1})),l.addEventListener("click",(()=>{l.classList.add("kg-audio-hide"),d.classList.remove("kg-audio-hide"),n.muted=!0})),r.addEventListener("click",(()=>{let e=g[(m+1)%5];m+=1,n.playbackRate=e.rate,r.textContent=e.label})),n.addEventListener("progress",L),i.addEventListener("input",(e=>{y(e.target),u.textContent=h(i.value),n.paused||cancelAnimationFrame(v)})),i.addEventListener("change",(()=>{n.currentTime=i.value,n.paused||requestAnimationFrame(k)})),s.addEventListener("input",(e=>{const t=e.target.value;y(e.target),n.volume=t/100}))},t=document.querySelectorAll(".kg-audio-card");for(let a=0;a<t.length;a++)e(t[a])}(),function(){const e=[...document.querySelectorAll(".kg-before-after-card")];for(let o of e){const e=o.querySelector("input"),i=o.querySelector(".kg-before-after-card-image-before"),r=o.querySelector(".kg-before-after-card-slider-button"),d=[...o.querySelectorAll("img")];function t(){i.setAttribute("style",`width: ${e.value}%`),r.setAttribute("style",`left: calc(${e.value}% - 18px`)}function a(){const e=getComputedStyle(d[0]).getPropertyValue("width");d[1].setAttribute("style",`width: ${e}`)}e.addEventListener("input",(function(){t()})),e.addEventListener("change",(function(){e.blur()})),window.addEventListener("resize",(function(){a()})),a(),t()}}(),document.querySelectorAll(".kg-gallery-image img").forEach((function(e){const t=e.closest(".kg-gallery-image"),a=e.attributes.width.value/e.attributes.height.value;t.style.flex=a+" 1 0%"})),function(){const e=document.getElementsByClassName("kg-toggle-heading"),t=function(e){const t=e.target.closest(".kg-toggle-card");"close"===t.getAttribute("data-kg-toggle-state")?t.setAttribute("data-kg-toggle-state","open"):t.setAttribute("data-kg-toggle-state","close")};for(let a=0;a<e.length;a++)e[a].addEventListener("click",t,!1)}(),function(){const e=function(e){const t=e.querySelector(".kg-video-player"),a=e.querySelector(".kg-video-player-container"),o=e.querySelector(".kg-video-play-icon"),i=e.querySelector(".kg-video-pause-icon"),r=e.querySelector(".kg-video-seek-slider"),d=e.querySelector(".kg-video-playback-rate"),l=e.querySelector(".kg-video-mute-icon"),s=e.querySelector(".kg-video-unmute-icon"),n=e.querySelector(".kg-video-volume-slider"),c=e.querySelector("video"),u=e.querySelector(".kg-video-duration"),g=e.querySelector(".kg-video-current-time"),v=e.querySelector(".kg-video-large-play-icon"),m=e.querySelector(".kg-video-overlay");let k=[{rate:.75,label:"0.7×"},{rate:1,label:"1×"},{rate:1.25,label:"1.2×"},{rate:1.75,label:"1.7×"},{rate:2,label:"2×"}],y=null,h=1;c.loop&&(v.classList.add("kg-video-hide-animated"),m.classList.add("kg-video-hide-animated"));const p=()=>{r.value=Math.floor(c.currentTime),g.textContent=L(r.value),t.style.setProperty("--seek-before-width",r.value/r.max*100+"%"),y=requestAnimationFrame(p)},f=e=>{e===r?t.style.setProperty("--seek-before-width",e.value/e.max*100+"%"):t.style.setProperty("--volume-before-width",e.value/e.max*100+"%")},L=e=>{const t=Math.floor(e/60),a=Math.floor(e%60);return`${t}:${a<10?`0${a}`:`${a}`}`},b=()=>{u.textContent=L(c.duration)},q=()=>{r.max=Math.floor(c.duration)},S=()=>{if(c.buffered.length>0){const e=Math.floor(c.buffered.end(c.buffered.length-1));t.style.setProperty("--buffered-width",e/r.max*100+"%")}};c.readyState>0?(b(),q(),S(),c.autoplay&&(y=requestAnimationFrame(p),o.classList.add("kg-video-hide"),i.classList.remove("kg-video-hide")),c.muted&&(s.classList.add("kg-video-hide"),l.classList.remove("kg-video-hide"))):c.addEventListener("loadedmetadata",(()=>{b(),q(),S(),c.autoplay&&(y=requestAnimationFrame(p),o.classList.add("kg-video-hide"),i.classList.remove("kg-video-hide")),c.muted&&(s.classList.add("kg-video-hide"),l.classList.remove("kg-video-hide"))})),e.onmouseover=()=>{c.loop||a.classList.remove("kg-video-hide-animated")},e.onmouseleave=()=>{!!(c.currentTime>0&&!c.paused&&!c.ended&&c.readyState>2)&&a.classList.add("kg-video-hide-animated")},e.addEventListener("click",(()=>{if(!c.loop){!!(c.currentTime>0&&!c.paused&&!c.ended&&c.readyState>2)?A():E()}})),c.onplay=()=>{v.classList.add("kg-video-hide-animated"),m.classList.add("kg-video-hide-animated"),o.classList.add("kg-video-hide"),i.classList.remove("kg-video-hide")};const E=()=>{v.classList.add("kg-video-hide-animated"),m.classList.add("kg-video-hide-animated"),o.classList.add("kg-video-hide"),i.classList.remove("kg-video-hide"),c.play(),y=requestAnimationFrame(p)},A=()=>{i.classList.add("kg-video-hide"),o.classList.remove("kg-video-hide"),c.pause(),cancelAnimationFrame(y)};v.addEventListener("click",(e=>{e.stopPropagation(),E()})),o.addEventListener("click",(e=>{e.stopPropagation(),E()})),i.addEventListener("click",(e=>{e.stopPropagation(),A()})),l.addEventListener("click",(e=>{e.stopPropagation(),l.classList.add("kg-video-hide"),s.classList.remove("kg-video-hide"),c.muted=!1})),s.addEventListener("click",(e=>{e.stopPropagation(),s.classList.add("kg-video-hide"),l.classList.remove("kg-video-hide"),c.muted=!0})),d.addEventListener("click",(e=>{e.stopPropagation();let t=k[(h+1)%5];h+=1,c.playbackRate=t.rate,d.textContent=t.label})),c.addEventListener("progress",S),r.addEventListener("input",(e=>{e.stopPropagation(),f(e.target),g.textContent=L(r.value),c.paused||cancelAnimationFrame(y)})),r.addEventListener("change",(e=>{e.stopPropagation(),c.currentTime=r.value,c.paused||requestAnimationFrame(p)})),n.addEventListener("click",(e=>{e.stopPropagation()})),r.addEventListener("click",(e=>{e.stopPropagation()})),n.addEventListener("input",(e=>{e.stopPropagation();const t=e.target.value;f(e.target),c.volume=t/100}))},t=document.querySelectorAll(".kg-video-card");for(let a=0;a<t.length;a++)e(t[a])}(); \ No newline at end of file diff --git a/src/assets/scss/_ghost.scss b/src/assets/scss/_ghost.scss index af49d8610..5f5290901 100644 --- a/src/assets/scss/_ghost.scss +++ b/src/assets/scss/_ghost.scss @@ -5,6 +5,10 @@ $margin-post: 20px; +:root { + --ghost-accent-color: #{$primary-color}; +} + .postContainer { max-width: 1200px; margin: $margin-post 0; @@ -17,214 +21,13 @@ $margin-post: 20px; color: $grey-1; margin-bottom: 8px; } - .description { div { max-width: 860px; line-height: 180%; } - ::ng-deep hr { - display: block; - margin: 3.2em 0; - padding: 0; - height: 1px; - border: 0; - border-top: 1px solid #dfe1e3; - } - ::ng-deep figure { - margin: 0; - figcaption { - font-size: small; - color: #626d79; - } - } - ::ng-deep .kg-embed-card { - position: relative; - width: 110%; - padding-top: 65%; - iframe { - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - width: 100%; - height: 100%; - border: none; - } - } - ::ng-deep a { - @include hyperlink; - padding: 0; - } - ::ng-deep p { - @include lato-regular-20; - line-height: 1.6em; - } - ::ng-deep li { - @include lato-regular-20; - line-height: 1.6em; - margin-bottom: 10px; - } - ::ng-deep h2 { - margin-top: 50px; - } - ::ng-deep blockquote { - margin: 1.5em 0; - padding: 0 1.6em; - border-left: 3px solid $blue; - } - ::ng-deep .kg-image-card { - margin: 0 auto; - max-width: 100%; - ::ng-deep .kg-image { - max-width: 100%; - margin-top: 10px; - display: block; - margin-left: auto; - margin-right: auto; - } - } - ::ng-deep .kg-file-card { - margin-top: 6vmin; - ::ng-deep .kg-file-card-container { - display: flex; - justify-content: space-between; - color: inherit; - padding: 6px; - border: 1px solid rgb(124 139 154/25%); - border-radius: 3px; - text-decoration: none; - ::ng-deep .kg-file-card-contents { - margin: 4px 8px; - ::ng-deep .kg-file-card-title + .kg-file-card-caption { - margin-top: -3px; - } - ::ng-deep .kg-file-card-title { - font-size: 1.15em; - line-height: 1.3em; - } - ::ng-deep .kg-file-card-caption, - .kg-file-card-filesize { - font-weight: normal; - font-size: 0.95em; - opacity: 0.6; - } - ::ng-deep .kg-file-card-filesize { - display: inline-block; - } - ::ng-deep .kg-file-card-metadata { - font-size: 0.825em; - margin-top: 4px; - ::ng-deep .kg-file-card-filename { - display: inline; - font-weight: 500; - } - ::ng-deep .kg-file-card-filesize:before { - display: inline-block; - content: '\2022'; - margin-right: 4px; - } - } - } - ::ng-deep .kg-file-card-icon { - position: relative; - display: flex; - align-items: center; - justify-content: center; - width: 80px; - } - ::ng-deep .kg-file-card-icon:before { - position: absolute; - display: block; - content: ''; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: currentColor; - opacity: 0.06; - border-radius: 2px; - } - ::ng-deep .kg-file-card-icon svg { - width: 24px; - height: 24px; - color: $red; - } - } - } - ::ng-deep .kg-bookmark-card { - margin-top: 30px; - font: inherit; - vertical-align: baseline; - ::ng-deep .kg-bookmark-container { - display: flex; - border-radius: 3px; - color: var(--darkgrey); - text-decoration: none; - box-shadow: 0 2px 5px -1px rgb(0 0 0 / 15%), 0 0 1px rgb(0 0 0 / 9%); - ::ng-deep .kg-bookmark-content { - flex-grow: 1; - display: flex; - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - padding: 20px; - ::ng-deep .kg-bookmark-title { - color: $grey-1; - @include lato-regular-18; - } - ::ng-deep .kg-bookmark-description { - display: -webkit-box; - overflow-y: hidden; - margin-top: 12px; - max-height: 48px; - color: $grey-2; - line-height: 1.5em; - font-weight: 400; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - } - ::ng-deep .kg-bookmark-metadata { - display: flex; - flex-wrap: wrap; - align-items: center; - margin-top: 14px; - color: var(--darkgrey); - font-weight: 500; - ::ng-deep .kg-bookmark-icon { - margin-right: 8px; - width: 22px; - height: 22px; - display: block; - } - ::ng-deep .kg-bookmark-author { - line-height: 1.5em; - @include lato-regular-18; - } - ::ng-deep .kg-bookmark-publisher { - overflow: hidden; - line-height: 1.5em; - text-overflow: ellipsis; - white-space: nowrap; - color: $grey-2; - } - } - } - ::ng-deep .kg-bookmark-thumbnail { - position: relative; - min-width: 33%; - max-height: 100%; - img { - position: absolute; - width: 100%; - height: 100%; - border-radius: 0 3px 3px 0; - -o-object-fit: cover; - object-fit: cover; - } - } - } + > div > * + * { + margin-top: 1em; } } @@ -234,11 +37,9 @@ $margin-post: 20px; [full-start] minmax(4vmin, auto) [wide-start] minmax(auto, 240px) [main-start] min(720px, calc(100% - 8vw)) [main-end] minmax(auto, 240px) [wide-end] minmax(4vmin, auto) [full-end]; } - .gh-canvas > * { grid-column: main-start/main-end; } - .gh-canvas .article-image { grid-column: wide-start/wide-end; width: 100%; -- GitLab From 8c709400529b5fa150facd3eaee2e0859eee5cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Pailharey?= <rpailharey@grandlyon.com> Date: Tue, 11 Apr 2023 11:28:43 +0200 Subject: [PATCH 15/47] feat: updated CNFS label icon --- .../logos/conseillerNumFranceServices.svg | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/assets/logos/conseillerNumFranceServices.svg b/src/assets/logos/conseillerNumFranceServices.svg index 0aea83f7c..fca2eddb4 100644 --- a/src/assets/logos/conseillerNumFranceServices.svg +++ b/src/assets/logos/conseillerNumFranceServices.svg @@ -1,17 +1,10 @@ <svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg"> -<rect width="40" height="40" rx="4" fill="#333333"/> -<g clip-path="url(#clip0_8017_41414)"> -<path d="M7.27914 13L3 15.5735V20.7195L7.0506 28H7.50768L11.5592 20.7195V15.5735L7.27914 13Z" fill="white"/> -<path d="M8.50339 17.411H10.1251V16.4361L7.27934 14.7242L4.43359 16.4361V19.8579L7.27934 21.5687L10.1251 19.8579V18.882H8.50339V17.411Z" fill="#333333"/> -<path d="M8.50333 18.882V17.411L7.27929 16.675L6.05615 17.411V18.882L7.27929 19.6179L8.50333 18.882Z" fill="white"/> -<path d="M16.6675 15.4954L17.0834 15.8277C16.9562 16.0043 16.7902 16.1467 16.5994 16.2429C16.4086 16.3392 16.1984 16.3865 15.9865 16.3809C15.755 16.3773 15.5283 16.3127 15.3273 16.1932C15.1263 16.0737 14.9576 15.9032 14.8369 15.6975C14.7162 15.4918 14.6475 15.2577 14.6371 15.0169C14.6268 14.7761 14.6751 14.5365 14.7776 14.3203C14.8801 14.1042 15.0335 13.9187 15.2234 13.7809C15.4133 13.6432 15.6336 13.5577 15.8638 13.5326C16.094 13.5074 16.3265 13.5433 16.5398 13.637C16.753 13.7307 16.9401 13.879 17.0834 14.0683L16.6675 14.4053C16.5922 14.2899 16.4908 14.1956 16.3721 14.1308C16.2535 14.066 16.1213 14.0328 15.9874 14.034C15.4974 14.034 15.1482 14.432 15.1482 14.9499C15.1482 15.4678 15.4974 15.8667 15.9874 15.8667C16.1213 15.8679 16.2535 15.8347 16.3721 15.7699C16.4908 15.7051 16.5922 15.6108 16.6675 15.4954Z" fill="white"/> -<path d="M20.0325 14.9479C20.0343 15.2328 19.9548 15.5117 19.8042 15.7494C19.6535 15.9871 19.4385 16.1729 19.1863 16.2831C18.9341 16.3933 18.6562 16.423 18.3878 16.3685C18.1194 16.3139 17.8726 16.1776 17.6787 15.9767C17.4848 15.7759 17.3525 15.5195 17.2987 15.2403C17.2449 14.961 17.272 14.6714 17.3765 14.4082C17.481 14.145 17.6582 13.92 17.8856 13.7619C18.113 13.6037 18.3805 13.5194 18.6539 13.5198C18.8354 13.516 19.0157 13.5502 19.1841 13.6205C19.3526 13.6908 19.5057 13.7958 19.6344 13.929C19.763 14.0623 19.8646 14.2212 19.933 14.3963C20.0014 14.5713 20.0352 14.759 20.0325 14.9479ZM19.4895 14.9479C19.4895 14.43 19.1412 14.032 18.6539 14.032C18.1667 14.032 17.8147 14.43 17.8147 14.9479C17.8147 15.4659 18.1639 15.8648 18.6539 15.8648C19.1439 15.8648 19.4895 15.4668 19.4895 14.9479ZM20.4886 13.5912H21.1651L22.327 15.5287V13.5912H22.8581V16.3018H22.1826L21.0161 14.3529V16.3018H20.4886V13.5912ZM23.6863 15.5592C23.7516 15.6567 23.8374 15.7375 23.9373 15.7952C24.0371 15.853 24.1482 15.8862 24.2622 15.8924C24.4698 15.8924 24.5959 15.7762 24.5959 15.5792C24.5959 15.0955 23.4075 15.204 23.4075 14.3024C23.4075 13.873 23.7448 13.517 24.2385 13.517C24.4143 13.5152 24.5881 13.5554 24.7466 13.6347C24.9051 13.7139 25.044 13.83 25.1526 13.974L24.7659 14.3329C24.6142 14.1282 24.4433 13.9968 24.2467 13.9968C24.2085 13.9929 24.17 13.9975 24.1336 14.0101C24.0972 14.0227 24.0638 14.0431 24.0354 14.07C24.0071 14.097 23.9845 14.1298 23.9691 14.1664C23.9536 14.2029 23.9458 14.2425 23.946 14.2824C23.946 14.7651 25.1343 14.6537 25.1343 15.5696C25.127 16.0733 24.7486 16.3818 24.2732 16.3818C24.0895 16.3906 23.9064 16.3543 23.7387 16.2757C23.571 16.1972 23.4234 16.0786 23.3079 15.9295L23.6863 15.5592ZM25.6399 13.5912H27.1546V14.0673H26.1673V14.6937H27.0065V15.1622H26.1673V15.8391H27.1546V16.3066H25.6399V13.5912ZM27.7196 13.5912H28.2516V16.3018H27.7241L27.7196 13.5912ZM28.9308 13.5912H29.4583V15.8029H30.4456V16.3018H28.9308V13.5912ZM30.8652 13.5912H31.3926V15.8029H32.3808V16.3018H30.8652V13.5912ZM32.8004 13.5912H34.3152V14.0673H33.3279V14.6937H34.1671V15.1622H33.3279V15.8391H34.3152V16.3066H32.8004V13.5912ZM34.8801 13.5912H35.6745C36.2468 13.5912 36.5996 13.8959 36.5996 14.3995C36.605 14.546 36.5683 14.6909 36.4942 14.8155C36.4201 14.9402 36.312 15.039 36.1837 15.0993L37.0009 16.298H36.3693L35.6782 15.2098H35.4039V16.3018H34.8765L34.8801 13.5912ZM35.4076 14.0673V14.7442H35.7047C35.9277 14.7442 36.0575 14.6204 36.0575 14.3995C36.0575 14.1948 35.9277 14.0673 35.7047 14.0673H35.4076ZM14.6436 17.4947H15.3191L16.4819 19.4322V17.4947H17.0075V20.2025H16.332L15.171 18.2564V20.2025H14.6436V17.4947ZM19.196 17.4947H19.7235V19.1418C19.7235 19.854 19.3222 20.2843 18.6686 20.2843C18.0149 20.2843 17.6182 19.8588 17.6182 19.1418V17.4947H18.1457V19.1885C18.1457 19.5522 18.3422 19.7655 18.6731 19.7655C19.0041 19.7655 19.196 19.5522 19.196 19.1885V17.4947ZM20.3332 17.4947H20.9978L21.6249 18.6087L22.2529 17.4947H22.9175V20.2025H22.3901V18.2783L21.8105 19.277H21.4394L20.8598 18.2783V20.2053H20.3332V17.4947ZM23.5977 17.4947H25.1124V17.9622H24.1242V18.5887H24.9607V19.0571H24.1215V19.734H25.1097V20.2025H23.5977V17.4947ZM24.1096 17.2624L24.5292 16.7407H25.0713L24.5886 17.2624H24.1096ZM25.681 17.4947H26.4754C27.0477 17.4947 27.4005 17.8004 27.4005 18.3031C27.4059 18.4497 27.3692 18.5947 27.2949 18.7194C27.2206 18.8441 27.1122 18.9428 26.9837 19.0028L27.8009 20.2025H27.1702L26.4791 19.1133H26.2048V20.2082H25.6774L25.681 17.4947ZM26.2085 17.9622V18.6391H26.5056C26.7277 18.6391 26.8575 18.5154 26.8575 18.2954C26.8575 18.0908 26.7277 17.9622 26.5056 17.9622H26.2085ZM28.0834 17.4947H28.6109V20.2025H28.0834V17.4947ZM32.0197 20.3948C32.082 20.3956 32.1439 20.385 32.2026 20.3634V20.827C32.1153 20.8627 32.022 20.8796 31.9283 20.8765C31.6243 20.8671 31.3344 20.7406 31.1147 20.5214L30.8067 20.2358C30.53 20.3119 30.2374 20.2959 29.9699 20.1901C29.7023 20.0844 29.4733 19.8941 29.3148 19.6459C29.1563 19.3978 29.0764 19.1042 29.0861 18.8064C29.0959 18.5085 29.1948 18.2213 29.3691 17.985C29.5435 17.7486 29.7844 17.575 30.0582 17.4885C30.3321 17.4019 30.625 17.4067 30.8961 17.5022C31.1671 17.5978 31.4027 17.7792 31.5698 18.0212C31.7368 18.2631 31.8271 18.5534 31.8278 18.8515C31.83 19.0678 31.785 19.2819 31.6962 19.4775C31.6073 19.6731 31.477 19.8452 31.3149 19.9806L31.4712 20.1349C31.6742 20.3243 31.8534 20.3948 32.0197 20.3948ZM31.2884 18.8515C31.2884 18.3326 30.9392 17.9346 30.4529 17.9346C29.9665 17.9346 29.6137 18.3326 29.6137 18.8515C29.6137 19.3703 29.9629 19.7683 30.4529 19.7683C30.9429 19.7683 31.2884 19.3694 31.2884 18.8515ZM33.7914 17.4947H34.3188V19.1418C34.3188 19.854 33.9175 20.2843 33.2639 20.2843C32.6103 20.2843 32.2135 19.8588 32.2135 19.1418V17.4947H32.741V19.1885C32.741 19.5522 32.9375 19.7655 33.2685 19.7655C33.5994 19.7655 33.7914 19.5522 33.7914 19.1885V17.4947ZM34.9249 17.4947H36.4397V17.9622H35.4524V18.5887H36.2961V19.0571H35.4569V19.734H36.4442V20.2025H34.9249V17.4947Z" fill="white"/> -<path d="M14.6565 21.5411H16.1712V22.0095H15.1794V22.636H16.0186V23.1034H15.1794V24.2459H14.6528L14.6565 21.5411ZM16.4903 22.2989H16.962V22.4893C17.0245 22.4172 17.1007 22.3593 17.1859 22.3195C17.271 22.2797 17.3632 22.2587 17.4565 22.258C17.5118 22.2578 17.5667 22.2668 17.6193 22.2847V22.7997C17.5516 22.7809 17.4818 22.7716 17.4117 22.7721C17.3223 22.7699 17.2339 22.792 17.155 22.836C17.0762 22.8801 17.0097 22.9446 16.962 23.0235V24.2459H16.4903V22.2989ZM17.8204 23.7347C17.8204 23.4367 18.0398 23.2082 18.4438 23.1387L19.0088 23.0377V22.9873C19.0088 22.7826 18.8598 22.6512 18.6486 22.6512C18.5651 22.6471 18.482 22.6665 18.4082 22.7074C18.3343 22.7482 18.2724 22.8091 18.229 22.8835L17.8798 22.6084C17.9711 22.4833 18.0899 22.3829 18.2262 22.3156C18.3626 22.2483 18.5124 22.2162 18.6632 22.2218C19.2053 22.2218 19.4859 22.5579 19.4859 22.9835V24.245H19.0106V24.0641C18.9409 24.1461 18.8552 24.2117 18.7592 24.2564C18.6631 24.301 18.559 24.3238 18.4539 24.3231C18.0763 24.3259 17.8204 24.1012 17.8204 23.7347ZM18.5517 23.9317C18.6443 23.9315 18.7352 23.9059 18.8154 23.8576C18.8956 23.8094 18.9623 23.74 19.0088 23.6566V23.39L18.5663 23.4709C18.3661 23.5062 18.2921 23.5909 18.2921 23.7147C18.2921 23.8384 18.3881 23.9317 18.548 23.9317H18.5517ZM19.9412 22.2989H20.412V22.4541C20.4846 22.3787 20.5711 22.3192 20.6663 22.2793C20.7615 22.2394 20.8634 22.2198 20.966 22.2218C21.3709 22.2218 21.6973 22.5074 21.6973 23.0882V24.2488H21.2128V23.112C21.2128 22.853 21.0757 22.6912 20.8471 22.6912C20.7565 22.6932 20.6682 22.7208 20.5915 22.7711C20.5148 22.8214 20.4528 22.8926 20.412 22.9768V24.2497H19.9412V22.2989ZM23.4616 23.6337L23.8364 23.9317C23.7438 24.0578 23.6239 24.1592 23.4865 24.2277C23.349 24.2962 23.198 24.3299 23.0456 24.3259C22.3993 24.3259 22.0136 23.8423 22.0136 23.2739C22.0136 22.7055 22.3993 22.2266 23.0456 22.2266C23.1979 22.2228 23.3489 22.2566 23.4863 22.3251C23.6237 22.3936 23.7437 22.4949 23.8364 22.6207L23.4616 22.9187C23.4151 22.8468 23.352 22.7882 23.278 22.7484C23.204 22.7086 23.1216 22.6889 23.0383 22.6912C22.8925 22.6982 22.755 22.7637 22.6546 22.874C22.5541 22.9843 22.4985 23.1308 22.4995 23.2828C22.5004 23.4348 22.5578 23.5805 22.6596 23.6894C22.7614 23.7983 22.8998 23.862 23.0456 23.867C23.1281 23.8672 23.2093 23.8459 23.282 23.8052C23.3546 23.7645 23.4163 23.7056 23.4616 23.6337ZM25.0138 24.3259C24.3492 24.3259 23.9744 23.8423 23.9744 23.2739C23.9744 22.7055 24.3227 22.2266 24.9361 22.2266C25.4553 22.2266 25.7972 22.5903 25.7972 23.1006C25.7971 23.1944 25.7873 23.2879 25.768 23.3795H24.4571C24.4863 23.7004 24.7021 23.8899 25.0211 23.8899C25.1118 23.8925 25.2017 23.8729 25.2837 23.8325C25.3657 23.7922 25.4373 23.7322 25.4928 23.6575L25.8311 23.9365C25.7338 24.0638 25.6092 24.1654 25.4672 24.233C25.3252 24.3007 25.1698 24.3325 25.0138 24.3259ZM24.4863 23.0035H25.3265C25.3254 22.9518 25.3142 22.9008 25.2935 22.8538C25.2729 22.8067 25.2433 22.7646 25.2065 22.7298C25.1698 22.6951 25.1266 22.6685 25.0796 22.6517C25.0326 22.6349 24.9829 22.6283 24.9334 22.6322C24.8279 22.6253 24.7238 22.6595 24.6412 22.7281C24.5585 22.7967 24.5034 22.8949 24.4863 23.0035Z" fill="white"/> -<path d="M14.8137 27.2059C14.9289 27.3564 15.066 27.4649 15.2442 27.4649C15.3933 27.4649 15.4746 27.3792 15.4746 27.264C15.4746 26.9232 14.6025 27.066 14.6025 26.3624C14.6025 26.0177 14.8768 25.7626 15.2671 25.7626C15.3982 25.7608 15.528 25.7898 15.6469 25.8475C15.7658 25.9052 15.8706 25.9901 15.9536 26.0958L15.6364 26.3853C15.5958 26.3215 15.5417 26.2682 15.4784 26.2294C15.415 26.1906 15.344 26.1674 15.2708 26.1615C15.1291 26.1615 15.055 26.231 15.055 26.3396C15.055 26.6718 15.928 26.5366 15.928 27.2288C15.9207 27.6391 15.6044 27.8629 15.2525 27.8629C15.1092 27.8673 14.9669 27.8371 14.8367 27.7746C14.7065 27.7122 14.5919 27.6192 14.502 27.503L14.8137 27.2059ZM17.1905 27.8629C16.5259 27.8629 16.1511 27.3792 16.1511 26.8108C16.1511 26.2424 16.4994 25.7635 17.1128 25.7635C17.632 25.7635 17.9739 26.1272 17.9739 26.6376C17.9737 26.7314 17.9639 26.8249 17.9446 26.9165H16.6319C16.6612 27.2374 16.8769 27.4268 17.196 27.4268C17.2866 27.4295 17.3765 27.4099 17.4585 27.3695C17.5405 27.3291 17.6121 27.2692 17.6677 27.1945L18.0059 27.4735C17.9089 27.6005 17.7845 27.7019 17.6428 27.7696C17.5012 27.8372 17.3462 27.8692 17.1905 27.8629ZM16.6612 26.5395H17.504C17.5029 26.4878 17.4917 26.4369 17.4711 26.3898C17.4505 26.3428 17.4209 26.3006 17.3841 26.2658C17.3473 26.2311 17.3041 26.2045 17.2572 26.1877C17.2102 26.1709 17.1605 26.1643 17.1109 26.1682C17.005 26.1606 16.9002 26.1944 16.817 26.2631C16.7338 26.3318 16.6782 26.4304 16.6612 26.5395ZM18.3514 25.8359H18.8231V26.0263C18.8854 25.954 18.9615 25.8961 19.0465 25.8561C19.1315 25.8161 19.2235 25.7949 19.3168 25.794C19.3723 25.7939 19.4276 25.8029 19.4804 25.8207V26.3357C19.4125 26.3168 19.3423 26.3075 19.272 26.3081C19.1827 26.3058 19.0943 26.3278 19.0156 26.3719C18.9369 26.416 18.8706 26.4806 18.8231 26.5595V27.782H18.3514V25.8359ZM20.0591 25.8359L20.5463 27.2288L21.0299 25.8359H21.5382L20.8553 27.7858H20.2346L19.5554 25.8359H20.0591ZM21.6826 25.1752C21.6836 25.0904 21.7163 25.0093 21.7739 24.9494C21.8315 24.8894 21.9093 24.8553 21.9907 24.8543C22.0724 24.8543 22.1507 24.8881 22.2085 24.9483C22.2663 25.0085 22.2987 25.0901 22.2987 25.1752C22.2987 25.2603 22.2663 25.3419 22.2085 25.402C22.1507 25.4622 22.0724 25.496 21.9907 25.496C21.9093 25.495 21.8315 25.4609 21.7739 25.4009C21.7163 25.341 21.6836 25.2599 21.6826 25.1752ZM21.753 25.8359H22.2247V27.7858H21.753V25.8359ZM24.0219 27.1707L24.3967 27.4687C24.3042 27.5948 24.1843 27.6963 24.0468 27.7648C23.9094 27.8333 23.7583 27.8669 23.606 27.8629C22.9597 27.8629 22.5739 27.3792 22.5739 26.8108C22.5739 26.2424 22.9597 25.7635 23.606 25.7635C23.7584 25.7597 23.9095 25.7935 24.0469 25.8622C24.1844 25.9309 24.3042 26.0325 24.3967 26.1587L24.0219 26.4557C23.9756 26.3836 23.9125 26.3249 23.8384 26.2851C23.7644 26.2453 23.6819 26.2257 23.5987 26.2282C23.4529 26.2352 23.3153 26.3007 23.2149 26.411C23.1144 26.5212 23.0589 26.6677 23.0598 26.8197C23.0608 26.9717 23.1181 27.1175 23.22 27.2264C23.3218 27.3353 23.4601 27.3989 23.606 27.404C23.6885 27.4043 23.7698 27.3832 23.8424 27.3424C23.9151 27.3017 23.9768 27.2427 24.0219 27.1707ZM25.5741 27.8629C24.9096 27.8629 24.5348 27.3792 24.5348 26.8108C24.5348 26.2424 24.884 25.7635 25.4964 25.7635C26.0166 25.7635 26.3576 26.1272 26.3576 26.6376C26.3574 26.7314 26.3476 26.8249 26.3283 26.9165H25.0174C25.0476 27.2374 25.2624 27.4268 25.5815 27.4268C25.6721 27.4296 25.7621 27.41 25.8441 27.3696C25.926 27.3292 25.9977 27.2692 26.0532 27.1945L26.3914 27.4735C26.2942 27.6008 26.1695 27.7023 26.0275 27.77C25.8855 27.8377 25.7302 27.8695 25.5741 27.8629ZM25.0522 26.5395H25.895C25.8939 26.4877 25.8827 26.4367 25.862 26.3896C25.8413 26.3425 25.8117 26.3002 25.7748 26.2655C25.7379 26.2307 25.6946 26.2042 25.6475 26.1874C25.6005 26.1707 25.5506 26.1642 25.501 26.1682C25.3952 26.1606 25.2905 26.1945 25.2075 26.2632C25.1244 26.3319 25.069 26.4304 25.0522 26.5395ZM26.8805 27.2059C26.9956 27.3564 27.1337 27.4649 27.3119 27.4649C27.46 27.4649 27.5414 27.3792 27.5414 27.264C27.5414 26.9232 26.6693 27.066 26.6693 26.3624C26.6693 26.0177 26.9481 25.7626 27.3339 25.7626C27.4651 25.7609 27.5951 25.7899 27.7141 25.8476C27.8331 25.9053 27.9381 25.9901 28.0213 26.0958L27.7032 26.3853C27.6628 26.3213 27.6088 26.2678 27.5454 26.229C27.482 26.1902 27.4109 26.1671 27.3375 26.1615C27.1968 26.1615 27.1218 26.231 27.1218 26.3396C27.1218 26.6718 27.9948 26.5366 27.9948 27.2288C27.9875 27.6391 27.6721 27.8629 27.3193 27.8629C27.176 27.8673 27.0337 27.8371 26.9035 27.7746C26.7733 27.7122 26.6587 27.6192 26.5687 27.503L26.8805 27.2059Z" fill="white"/> -</g> -<defs> -<clipPath id="clip0_8017_41414"> -<rect width="34" height="15" fill="white" transform="translate(3 13)"/> -</clipPath> -</defs> -</svg> + <rect width="40" height="40" rx="4" fill="#333333" /> + <path d="M19.499 4.29761L10.7404 9.56506V20.098L19.0313 35.0001H19.9668L28.2596 20.098V9.56506L19.499 4.29761Z" + fill="white" /> + <path + d="M22.0044 13.3258H25.3237V11.3303L19.499 7.82642L13.6742 11.3303V18.334L19.499 21.8359L25.3237 18.334V16.3366H22.0044V13.3258Z" + fill="#333333" /> + <path d="M22.0046 16.337V13.3262L19.4992 11.8198L16.9956 13.3262V16.337L19.4992 17.8434L22.0046 16.337Z" + fill="white" /> +</svg> \ No newline at end of file -- GitLab From 192ef8cec307329d86c23da5d885148e91688cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marl=C3=A8ne=20SIMONDANT?= <msimondant@grandlyon.com> Date: Thu, 13 Apr 2023 08:28:35 +0000 Subject: [PATCH 16/47] fix(carto): filters display missing margins --- .../components/more-filters/more-filters.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/structure-list/components/more-filters/more-filters.component.html b/src/app/structure-list/components/more-filters/more-filters.component.html index 91b35ae29..8ebb36094 100644 --- a/src/app/structure-list/components/more-filters/more-filters.component.html +++ b/src/app/structure-list/components/more-filters/more-filters.component.html @@ -1,7 +1,7 @@ <div *ngIf="modalType" [ngClass]="['modal', 'modal' + getModalType()]"> <!-- Filter with single category --> <div *ngIf="categories.length === 1" class="contentModal max-height" fxLayout="row wrap" fxLayoutAlign="flex-start"> - <div *ngFor="let c of categories" cclass="blockFiltre"> + <div *ngFor="let c of categories" class="blockFiltre"> <ul class="blockLigne"> <li *ngFor="let module of c.modules" fxLayout="row" fxLayoutAlign="start center" class="ligneFiltre"> <div class="checkbox"> -- GitLab From 074e8b71c3d38d9ab71b541d17c8b3397c364fa2 Mon Sep 17 00:00:00 2001 From: Marlene Simondant <msimondant@grandlyon.com> Date: Thu, 13 Apr 2023 14:57:57 +0200 Subject: [PATCH 17/47] fix(onboarding): freewifi screen is not validated when using prev/next buttons --- .../structure-form/structure-wifi/structure-wifi.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/form/form-view/structure-form/structure-wifi/structure-wifi.component.ts b/src/app/form/form-view/structure-form/structure-wifi/structure-wifi.component.ts index 088132a11..0222cb1c9 100644 --- a/src/app/form/form-view/structure-form/structure-wifi/structure-wifi.component.ts +++ b/src/app/form/form-view/structure-form/structure-wifi/structure-wifi.component.ts @@ -15,7 +15,7 @@ export class StructureWifiComponent implements OnInit { public formUtils = new formUtils(); ngOnInit(): void { - if (this.isEditMode) this.validateForm.emit(); + this.validateForm.emit(); } public isInArray(formControlName: string, term: string): boolean { return this.formUtils.isInCategoryArray(term, formControlName, this.structureForm); -- GitLab From 881c4e735e222610e623763daeae0d4481e2ebe1 Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Mon, 17 Apr 2023 12:14:46 +0000 Subject: [PATCH 18/47] Update mr template.md --- .gitlab/merge_request_templates/default.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab/merge_request_templates/default.md b/.gitlab/merge_request_templates/default.md index 8a8e3247a..5ca9e96a5 100644 --- a/.gitlab/merge_request_templates/default.md +++ b/.gitlab/merge_request_templates/default.md @@ -1,3 +1,5 @@ +# Related to #000 + ## What does this MR do and why? _Describe in detail what your merge request does and why._ -- GitLab From c3df5644112834353775b0135962f7bccb5a5660 Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Mon, 17 Apr 2023 15:05:39 +0000 Subject: [PATCH 19/47] chore(admin): refactor and add aggrid --- src/app/admin/admin-routing.module.ts | 53 ++++- src/app/admin/admin.module.ts | 6 +- .../admin/{admin-pannel.scss => admin.scss} | 29 ++- .../claim-structure.component.html | 34 ++-- .../claim-structure.component.ts | 50 ++++- .../deleted-structures.component.html | 3 +- .../deleted-structures.component.scss | 7 - .../deleted-structures.component.ts | 4 +- .../manage-lockdown-info.component.html | 3 +- .../manage-lockdown-info.component.ts | 2 +- .../manage-employers.component.html | 75 ++++--- .../manage-employers.component.scss | 20 -- .../manage-employers.component.ts | 135 +++++++------ .../attached-users.component.html | 6 +- .../attached-users.component.ts | 8 +- .../manage-jobs/manage-jobs.component.html | 75 ++++--- .../manage-jobs/manage-jobs.component.scss | 1 - .../manage-jobs/manage-jobs.component.ts | 187 +++++++++--------- .../manage-users/manage-users.component.html | 112 +++++------ .../manage-users/manage-users.component.scss | 1 - .../manage-users/manage-users.component.ts | 145 +++++++------- .../components/nav-bar/nav-bar.component.html | 41 ++++ .../components/nav-bar/nav-bar.component.ts | 17 ++ .../components/panel/panel.component.html | 45 ----- .../components/panel/panel.component.spec.ts | 25 --- .../admin/components/panel/panel.component.ts | 30 --- .../admin-structures-list.component.html | 127 +++++------- .../admin-structures-list.component.ts | 34 +++- src/app/admin/services/panel-route.service.ts | 14 -- src/app/shared/enum/adminPanel.enum.ts | 9 - 30 files changed, 633 insertions(+), 665 deletions(-) rename src/app/admin/{admin-pannel.scss => admin.scss} (65%) delete mode 100644 src/app/admin/components/deleted-structures/deleted-structures.component.scss delete mode 100644 src/app/admin/components/manage-employers/manage-employers.component.scss create mode 100644 src/app/admin/components/nav-bar/nav-bar.component.html create mode 100644 src/app/admin/components/nav-bar/nav-bar.component.ts delete mode 100644 src/app/admin/components/panel/panel.component.html delete mode 100644 src/app/admin/components/panel/panel.component.spec.ts delete mode 100644 src/app/admin/components/panel/panel.component.ts delete mode 100644 src/app/admin/services/panel-route.service.ts delete mode 100644 src/app/shared/enum/adminPanel.enum.ts diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts index 9a945719d..eb4d6760c 100644 --- a/src/app/admin/admin-routing.module.ts +++ b/src/app/admin/admin-routing.module.ts @@ -1,11 +1,58 @@ import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; -import { PanelComponent } from './components/panel/panel.component'; +import { RouterModule, Routes } from '@angular/router'; +import { ClaimStructureComponent } from './components/claim-structure/claim-structure.component'; +import { DeletedStructuresComponent } from './components/deleted-structures/deleted-structures.component'; +import { ManageLockdownInfoComponent } from './components/lockdown-info/manage-lockdown-info.component'; +import { ManageEmployersComponent } from './components/manage-employers/manage-employers.component'; +import { ManageJobsComponent } from './components/manage-jobs/manage-jobs.component'; +import { ManageUsersComponent } from './components/manage-users/manage-users.component'; +import { AdminStructuresListComponent } from './components/structures-list/admin-structures-list.component'; + +export const AdminRoutes = { + deletedStructures: { + link: 'admin/deleted-structures', + path: 'deleted-structures', + }, + employersList: { + link: 'admin/employers-list', + path: 'employers-list', + }, + jobsList: { + link: 'admin/jobs-list', + path: 'jobs-list', + }, + lockdownInfo: { + link: 'admin/lockdown-info', + path: 'lockdown-info', + }, + manageUsers: { + link: 'admin/manage-users', + path: 'manage-users', + }, + pendingStructures: { + link: 'admin/pending-structure', + path: 'pending-structure', + }, + structuresList: { + link: 'admin/structure-list', + path: 'structure-list', + }, +}; const routes: Routes = [ { path: '', - component: PanelComponent, + component: ClaimStructureComponent, + }, + { path: AdminRoutes.deletedStructures.path, component: DeletedStructuresComponent }, + { path: AdminRoutes.employersList.path, component: ManageEmployersComponent }, + { path: AdminRoutes.jobsList.path, component: ManageJobsComponent }, + { path: AdminRoutes.lockdownInfo.path, component: ManageLockdownInfoComponent }, + { path: AdminRoutes.manageUsers.path, component: ManageUsersComponent }, + { path: AdminRoutes.pendingStructures.path, component: ClaimStructureComponent }, + { + path: AdminRoutes.structuresList.path, + component: AdminStructuresListComponent, }, ]; @NgModule({ diff --git a/src/app/admin/admin.module.ts b/src/app/admin/admin.module.ts index 22525977d..31320291c 100644 --- a/src/app/admin/admin.module.ts +++ b/src/app/admin/admin.module.ts @@ -4,6 +4,7 @@ import { AgGridModule } from 'ag-grid-angular'; import { SharedModule } from '../shared/shared.module'; import { AdminRoutingModule } from './admin-routing.module'; import { ClaimStructureComponent } from './components/claim-structure/claim-structure.component'; +import { DeletedStructuresComponent } from './components/deleted-structures/deleted-structures.component'; import { ManageLockdownInfoComponent } from './components/lockdown-info/manage-lockdown-info.component'; import { DeleteEmployerComponent } from './components/manage-employers/delete-employer/delete-employer.component'; import { ManageEmployersComponent } from './components/manage-employers/manage-employers.component'; @@ -18,13 +19,11 @@ import { DeleteUserComponent } from './components/manage-users/delete-user/delet import { EmployerRendererComponent } from './components/manage-users/employer-renderer/employer-renderer.component'; import { JobRendererComponent } from './components/manage-users/job-renderer/job-renderer.component'; import { ManageUsersComponent } from './components/manage-users/manage-users.component'; -import { PanelComponent } from './components/panel/panel.component'; +import { NavBarComponent } from './components/nav-bar/nav-bar.component'; import { AdminStructuresListComponent } from './components/structures-list/admin-structures-list.component'; -import { DeletedStructuresComponent } from './components/deleted-structures/deleted-structures.component'; @NgModule({ declarations: [ - PanelComponent, ClaimStructureComponent, AdminStructuresListComponent, ManageLockdownInfoComponent, @@ -42,6 +41,7 @@ import { DeletedStructuresComponent } from './components/deleted-structures/dele ManageJobsComponent, ManageEmployersComponent, DeletedStructuresComponent, + NavBarComponent, ], imports: [CommonModule, AdminRoutingModule, SharedModule, AgGridModule], }) diff --git a/src/app/admin/admin-pannel.scss b/src/app/admin/admin.scss similarity index 65% rename from src/app/admin/admin-pannel.scss rename to src/app/admin/admin.scss index 1de269d3a..fa2f89dbb 100644 --- a/src/app/admin/admin-pannel.scss +++ b/src/app/admin/admin.scss @@ -1,19 +1,11 @@ @import '../../assets/scss/color'; -.selector { - margin-bottom: 20px; - .option { - margin-right: 30px; - } -} - -.results-tab { - margin-bottom: 20px; -} - -.results-column { - width: 100%; - max-width: 600px; +.adminLayout { + display: flex; + flex-direction: column; + align-items: center; + margin: auto; + width: 80%; } .incomplete { @@ -24,8 +16,11 @@ color: $red; } -.structure-updated-at { - text-align: right; +::ng-deep .red { + color: $red; + a { + color: $red; + } } .error { @@ -33,7 +28,7 @@ font-weight: bold; } -.singleCheckbox { +.lockdownCheckbox { background: $white; border-radius: 4px; padding: 0 16px; diff --git a/src/app/admin/components/claim-structure/claim-structure.component.html b/src/app/admin/components/claim-structure/claim-structure.component.html index 8b2d42ada..0e63cd7fe 100644 --- a/src/app/admin/components/claim-structure/claim-structure.component.html +++ b/src/app/admin/components/claim-structure/claim-structure.component.html @@ -1,25 +1,13 @@ -<div fxLayout="column" fxLayoutAlign="center center"> +<app-admin-nav-bar /> +<div class="adminLayout"> <h2>Revendication structure</h2> - <table *ngIf="isClaimedStructure" aria-describedby="demands attachment results" class="results-tab"> - <thead> - <th scope="col">Utilisateur</th> - <th scope="col">Structure</th> - <th scope="col">Date de demande</th> - <th scope="col">Options</th> - </thead> - <tbody> - <tr *ngFor="let structure of demandsAttachment"> - <td>{{ structure.userEmail }}</td> - <td>{{ structure.structureName }}</td> - <td>{{ structure.createdAt | date: 'mediumDate' }}</td> - <td> - <button type="button" (click)="acceptDemand(structure)">Valider</button> - <button type="button" (click)="refuseDemand(structure)">Refuser</button> - </td> - </tr> - <tr *ngIf="!demandsAttachment?.length"> - <td colspan="3">Aucune demande en attente</td> - </tr> - </tbody> - </table> + <ag-grid-angular + *ngIf="demandsAttachment?.length" + class="ag-theme-alpine" + domLayout="autoHeight" + style="width: 100%" + [rowData]="demandsAttachment" + [columnDefs]="columnsDefs" + /> + <div *ngIf="!demandsAttachment?.length">Aucune demande en attente</div> </div> diff --git a/src/app/admin/components/claim-structure/claim-structure.component.ts b/src/app/admin/components/claim-structure/claim-structure.component.ts index 56938c59b..3dd2a7f23 100644 --- a/src/app/admin/components/claim-structure/claim-structure.component.ts +++ b/src/app/admin/components/claim-structure/claim-structure.component.ts @@ -1,4 +1,6 @@ +import { DatePipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; +import { ColDef } from 'ag-grid-community'; import { NotificationService } from '../../../services/notification.service'; import { StructureAdminInfo } from '../../models/demandAttachment.model'; import { AdminService } from '../../services/admin.service'; @@ -6,14 +8,19 @@ import { AdminService } from '../../services/admin.service'; @Component({ selector: 'app-admin-claim-structure', templateUrl: './claim-structure.component.html', - styleUrls: ['../../admin-pannel.scss'], + styleUrls: ['../../admin.scss'], }) export class ClaimStructureComponent implements OnInit { public demandsAttachment: StructureAdminInfo[]; public structuresUnclaimed: StructureAdminInfo[]; public isClaimedStructure: boolean = true; public isUnclaimedStructure: boolean = false; - constructor(private adminService: AdminService, private notificationService: NotificationService) {} + + constructor( + private adminService: AdminService, + private notificationService: NotificationService, + private datePipe: DatePipe + ) {} ngOnInit(): void { this.adminService.getPendingStructure().subscribe((demands) => { @@ -27,7 +34,7 @@ export class ClaimStructureComponent implements OnInit { this.demandsAttachment = data; this.notificationService.showSuccess('Demande acceptée avec succès'); }, - error: (e) => { + error: () => { this.notificationService.showError('Une erreur est survenue'); }, }); @@ -39,13 +46,42 @@ export class ClaimStructureComponent implements OnInit { this.demandsAttachment = data; this.notificationService.showSuccess('Demande refusée avec succès'); }, - error: (e) => { + error: () => { this.notificationService.showError('Une erreur est survenue'); }, }); } - public claimedStructure(_event: boolean): void { - this.isClaimedStructure = !this.isClaimedStructure; - } + public columnsDefs: ColDef<StructureAdminInfo>[] = [ + { + headerName: 'Utilisateur', + field: 'userEmail', + }, + { + headerName: 'Structure', + field: 'structureName', + flex: 1, + }, + { + headerName: 'Date de demande', + field: 'createdAt', + valueFormatter: (params) => this.datePipe.transform(params.value, 'mediumDate'), + }, + { + headerName: 'Valider', + width: 100, + cellRenderer: () => '<button type="button">Valider</button>', + onCellClicked: (params) => { + this.acceptDemand(params.data); + }, + }, + { + headerName: 'Refuser', + width: 100, + cellRenderer: () => '<button type="button">Refuser</button>', + onCellClicked: (params) => { + this.refuseDemand(params.data); + }, + }, + ]; } diff --git a/src/app/admin/components/deleted-structures/deleted-structures.component.html b/src/app/admin/components/deleted-structures/deleted-structures.component.html index e4b520515..636ee8bbf 100644 --- a/src/app/admin/components/deleted-structures/deleted-structures.component.html +++ b/src/app/admin/components/deleted-structures/deleted-structures.component.html @@ -1,7 +1,8 @@ +<app-admin-nav-bar /> <div *ngIf="isLoading" class="loader"> <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt /> </div> -<div *ngIf="!isLoading" class="deletedStructures"> +<div *ngIf="!isLoading" class="adminLayout"> <h2>Liste des structures supprimées</h2> <ag-grid-angular *ngIf="deletedStructures" diff --git a/src/app/admin/components/deleted-structures/deleted-structures.component.scss b/src/app/admin/components/deleted-structures/deleted-structures.component.scss deleted file mode 100644 index 74e60b461..000000000 --- a/src/app/admin/components/deleted-structures/deleted-structures.component.scss +++ /dev/null @@ -1,7 +0,0 @@ -.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 index 2c3e281cf..d6f56b36c 100644 --- a/src/app/admin/components/deleted-structures/deleted-structures.component.ts +++ b/src/app/admin/components/deleted-structures/deleted-structures.component.ts @@ -8,7 +8,7 @@ import { AdminService } from '../../services/admin.service'; @Component({ selector: 'app-deleted-structures', templateUrl: './deleted-structures.component.html', - styleUrls: ['./deleted-structures.component.scss'], + styleUrls: ['../../admin.scss'], }) export class DeletedStructuresComponent implements OnInit { public deletedStructures: Structure[]; @@ -45,7 +45,7 @@ export class DeletedStructuresComponent implements OnInit { { headerName: 'Structure', field: 'structureName', - minWidth: 450, + flex: 1, sortable: true, cellRenderer: (params) => this.renderLink(params.data), }, 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 index e4e78daa9..8b0f729ac 100644 --- a/src/app/admin/components/lockdown-info/manage-lockdown-info.component.html +++ b/src/app/admin/components/lockdown-info/manage-lockdown-info.component.html @@ -1,3 +1,4 @@ +<app-admin-nav-bar /> <div *ngIf="isLoading" class="loader"> <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt /> </div> @@ -5,7 +6,7 @@ <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 }"> + <div *ngIf="!error" class="lockdownCheckbox" [ngClass]="{ checked: lockdownInfoDisplay }"> <input type="checkbox" name="lockdownInfo" 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 index 187fb3541..11a2e9a99 100644 --- a/src/app/admin/components/lockdown-info/manage-lockdown-info.component.ts +++ b/src/app/admin/components/lockdown-info/manage-lockdown-info.component.ts @@ -4,7 +4,7 @@ import { ParametersService } from '../../services/parameters.service'; @Component({ selector: 'app-admin-manage-lockdown-info', templateUrl: './manage-lockdown-info.component.html', - styleUrls: ['../../admin-pannel.scss'], + styleUrls: ['../../admin.scss'], }) export class ManageLockdownInfoComponent implements OnInit { public isLoading: boolean = true; diff --git a/src/app/admin/components/manage-employers/manage-employers.component.html b/src/app/admin/components/manage-employers/manage-employers.component.html index 5abe1c66a..acdcc7b10 100644 --- a/src/app/admin/components/manage-employers/manage-employers.component.html +++ b/src/app/admin/components/manage-employers/manage-employers.component.html @@ -1,3 +1,4 @@ +<app-admin-nav-bar /> <div fxLayout="column" fxLayoutGap="5px" fxLayoutAlign="center center" class="userBlock"> <h2> Gestion des employeurs @@ -7,44 +8,42 @@ </h2> </div> -<div class="tables-list"> - <div> - <h3 *ngIf="unvalidatedEmployers" class="title">Employeurs non validées ({{ unvalidatedEmployers.length }})</h3> - <ag-grid-angular - *ngIf="unvalidatedEmployers" - class="ag-theme-alpine user-table" - rowSelection="multiple" - domLayout="autoHeight" - [rowData]="unvalidatedEmployers" - [columnDefs]="unvalidEmployersColumnDefs" - [getRowHeight]="getRowHeight" - [defaultColDef]="unvalidColDef" - [frameworkComponents]="frameworkComponents" - > - </ag-grid-angular> - </div> - <div> - <h3 *ngIf="validatedEmployers" class="title">Employeurs validées ({{ validatedEmployers.length }})</h3> - <ag-grid-angular - *ngIf="validatedEmployers" - class="ag-theme-alpine user-table" - rowSelection="multiple" - domLayout="autoHeight" - [rowData]="validatedEmployers" - [columnDefs]="columnDefs" - [getRowHeight]="getRowHeight" - [defaultColDef]="defaultColDef" - [frameworkComponents]="frameworkComponents" - > - </ag-grid-angular> - </div> - <div> - <h3 *ngIf="validatedEmployers" class="title">Créer un nouvel employeur</h3> - <form [formGroup]="newEmployerForm" (ngSubmit)="onSubmit()"> - <input type="text" maxlength="100" formControlName="employer" class="form-input" /> - <button type="submit" [ngClass]="{ invalid: !newEmployerForm.valid }">Créer</button> - </form> - </div> +<div class="adminLayout"> + <h3 *ngIf="unvalidatedEmployers" class="title">Employeurs non validées ({{ unvalidatedEmployers.length }})</h3> + <ag-grid-angular + *ngIf="unvalidatedEmployers" + class="ag-theme-alpine user-table" + rowSelection="multiple" + domLayout="autoHeight" + style="width: 100%" + [rowData]="unvalidatedEmployers" + [columnDefs]="unvalidEmployersColumnDefs" + [getRowHeight]="getRowHeight" + [defaultColDef]="unvalidColDef" + [frameworkComponents]="frameworkComponents" + > + </ag-grid-angular> + + <h3 *ngIf="validatedEmployers" class="title">Employeurs validées ({{ validatedEmployers.length }})</h3> + <ag-grid-angular + *ngIf="validatedEmployers" + class="ag-theme-alpine user-table" + rowSelection="multiple" + domLayout="autoHeight" + style="width: 100%" + [rowData]="validatedEmployers" + [columnDefs]="columnDefs" + [getRowHeight]="getRowHeight" + [defaultColDef]="defaultColDef" + [frameworkComponents]="frameworkComponents" + > + </ag-grid-angular> + + <h3 *ngIf="validatedEmployers" class="title">Créer un nouvel employeur</h3> + <form [formGroup]="newEmployerForm" (ngSubmit)="onSubmit()"> + <input type="text" maxlength="100" formControlName="employer" class="form-input" /> + <button type="submit" [ngClass]="{ invalid: !newEmployerForm.valid }">Créer</button> + </form> </div> <app-modal-confirmation *ngIf="employerToDelete" diff --git a/src/app/admin/components/manage-employers/manage-employers.component.scss b/src/app/admin/components/manage-employers/manage-employers.component.scss deleted file mode 100644 index 27ad71aba..000000000 --- a/src/app/admin/components/manage-employers/manage-employers.component.scss +++ /dev/null @@ -1,20 +0,0 @@ -@import '../../../../assets/scss/color'; - -.user-table { - width: 100%; - height: 100%; - text-overflow: clip; -} - -.tables-list { - height: 100%; - width: 80%; - display: flex; - flex-direction: column; - margin-left: 10%; - margin-bottom: 2%; -} - -app-delete-user { - text-align: center; -} diff --git a/src/app/admin/components/manage-employers/manage-employers.component.ts b/src/app/admin/components/manage-employers/manage-employers.component.ts index 947407438..dbd7450b5 100644 --- a/src/app/admin/components/manage-employers/manage-employers.component.ts +++ b/src/app/admin/components/manage-employers/manage-employers.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; +import { ColDef } from 'ag-grid-community'; import { Employer } from '../../../models/employer.model'; import { NotificationService } from '../../../services/notification.service'; import { AdminService } from '../../services/admin.service'; @@ -11,7 +12,7 @@ import { ValidateEmployerComponent } from './validate-employer/validate-employer @Component({ selector: 'app-admin-manage-employers', templateUrl: './manage-employers.component.html', - styleUrls: ['./manage-employers.component.scss'], + styleUrls: ['../../admin.scss'], }) export class ManageEmployersComponent implements OnInit { public newEmployerForm: UntypedFormGroup; @@ -30,10 +31,8 @@ export class ManageEmployersComponent implements OnInit { }; public contextRow: any; - public columnDefs; - public unvalidEmployersColumnDefs; public frameworkComponents; - public defaultColDef = { + public defaultColDef: ColDef = { editable: true, sortable: true, flex: 1, @@ -41,12 +40,75 @@ export class ManageEmployersComponent implements OnInit { filter: true, resizable: true, }; - public unvalidColDef = { + public unvalidColDef: ColDef = { ...this.defaultColDef, cellStyle: { color: '#da6c2e', }, }; + public columnDefs: ColDef<Employer>[] = [ + { + headerName: 'Employeur', + field: 'name', + editable: true, + onCellValueChanged: this.onChange.bind(this), + }, + { + headerName: 'Acteurs rattachés', + cellRenderer: 'attachedUsersComponent', + cellRendererParams: { + users: 'users', + }, + minWidth: 500, + }, + { + headerName: 'Suppression', + editable: false, + minWidth: 100, + cellRenderer: 'deleteEmployerComponent', + cellRendererParams: { + onClick: this.onDeleteButtonClick.bind(this), + label: 'Supprimer', + }, + }, + ]; + public unvalidEmployersColumnDefs: ColDef<Employer>[] = [ + { + headerName: 'Employeur', + field: 'name', + editable: true, + onCellValueChanged: this.onChange.bind(this), + }, + { + headerName: 'Acteurs rattachés', + cellRenderer: 'attachedUsersComponent', + cellRendererParams: { + users: 'users', + }, + minWidth: 500, + }, + { + headerName: 'Fusionner', + field: '_id', + cellRenderer: 'employerRenderer', + singleClickEdit: true, + cellEditor: 'agSelectCellEditor', + cellEditorParams: { + values: this.validatedEmployersName, + }, + onCellValueChanged: this.onMerge.bind(this), + }, + { + headerName: 'Valider', + editable: false, + minWidth: 100, + cellRenderer: 'validateEmployerComponent', + cellRendererParams: { + onClick: this.onValidateButtonClick.bind(this), + label: 'Valider', + }, + }, + ]; constructor( private adminService: AdminService, @@ -55,69 +117,6 @@ export class ManageEmployersComponent implements OnInit { ) { this.findValidatedEmployers(); this.findUnvalidatedEmployers(); - this.unvalidEmployersColumnDefs = [ - { - headerName: 'Employeur', - field: 'name', - editable: true, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Acteurs rattachés', - cellRenderer: 'attachedUsersComponent', - cellRendererParams: { - users: 'users', - }, - minWidth: 500, - }, - { - headerName: 'Fusionner', - field: '_id', - cellRenderer: 'employerRenderer', - singleClickEdit: true, - cellEditor: 'agSelectCellEditor', - cellEditorParams: { - values: this.validatedEmployersName, - }, - onCellValueChanged: this.onMerge.bind(this), - }, - { - headerName: 'Valider', - editable: false, - minWidth: 100, - cellRenderer: 'validateEmployerComponent', - cellRendererParams: { - onClick: this.onValidateButtonClick.bind(this), - label: 'Valider', - }, - }, - ]; - this.columnDefs = [ - { - headerName: 'Employeur', - field: 'name', - editable: true, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Acteurs rattachés', - cellRenderer: 'attachedUsersComponent', - cellRendererParams: { - users: 'users', - }, - minWidth: 500, - }, - { - headerName: 'Suppression', - editable: false, - minWidth: 100, - cellRenderer: 'deleteEmployerComponent', - cellRendererParams: { - onClick: this.onDeleteButtonClick.bind(this), - label: 'Supprimer', - }, - }, - ]; this.frameworkComponents = { employerRenderer: EmployerRendererComponent, deleteEmployerComponent: DeleteEmployerComponent, diff --git a/src/app/admin/components/manage-jobs/attached-users/attached-users.component.html b/src/app/admin/components/manage-jobs/attached-users/attached-users.component.html index 0d678274e..79877cac0 100644 --- a/src/app/admin/components/manage-jobs/attached-users/attached-users.component.html +++ b/src/app/admin/components/manage-jobs/attached-users/attached-users.component.html @@ -1,7 +1,7 @@ <div *ngIf="users.data.users && users.data.users.length !== 0"> <p *ngFor="let user of users.data.users"> - <span tabindex="0" (click)="goToManageUsers()" (keyup.enter)="goToManageUsers()" - >{{ user.name }} {{ user.surname }} - {{ user.email }}</span - > + <span tabindex="0" (click)="goToManageUsers()" (keyup.enter)="goToManageUsers()"> + {{ user.name }} {{ user.surname }} - {{ user.email }} + </span> </p> </div> diff --git a/src/app/admin/components/manage-jobs/attached-users/attached-users.component.ts b/src/app/admin/components/manage-jobs/attached-users/attached-users.component.ts index 89c1cd56e..0796f51b5 100644 --- a/src/app/admin/components/manage-jobs/attached-users/attached-users.component.ts +++ b/src/app/admin/components/manage-jobs/attached-users/attached-users.component.ts @@ -1,6 +1,6 @@ import { Component, Input } from '@angular/core'; -import { AdminPanelEnum } from '../../../../shared/enum/adminPanel.enum'; -import { PanelRouteService } from '../../../services/panel-route.service'; +import { Router } from '@angular/router'; +import { AdminRoutes } from '../../../admin-routing.module'; @Component({ selector: 'app-attached-users', @@ -11,10 +11,10 @@ export class AttachedUsersComponent { @Input() redirect = ''; public users: any; - constructor(private panelRouteService: PanelRouteService) {} + constructor(private router: Router) {} public goToManageUsers() { - this.panelRouteService.redirectTo(AdminPanelEnum.manageUsers); + this.router.navigateByUrl(AdminRoutes.manageUsers.link); } public agInit(params: any): void { diff --git a/src/app/admin/components/manage-jobs/manage-jobs.component.html b/src/app/admin/components/manage-jobs/manage-jobs.component.html index 8575f3b79..efb928223 100644 --- a/src/app/admin/components/manage-jobs/manage-jobs.component.html +++ b/src/app/admin/components/manage-jobs/manage-jobs.component.html @@ -1,3 +1,4 @@ +<app-admin-nav-bar /> <div fxLayout="column" fxLayoutGap="5px" fxLayoutAlign="center center" class="userBlock"> <h2> Gestion des fonctions @@ -5,44 +6,42 @@ </h2> </div> -<div class="tables-list"> - <div> - <h3 *ngIf="unvalidatedJobs" class="title">Fonctions non validées ({{ unvalidatedJobs.length }})</h3> - <ag-grid-angular - *ngIf="unvalidatedJobs" - class="ag-theme-alpine user-table" - rowSelection="multiple" - domLayout="autoHeight" - [rowData]="unvalidatedJobs" - [columnDefs]="unvalidJobsColumnDefs" - [getRowHeight]="getRowHeight" - [defaultColDef]="unvalidColDef" - [frameworkComponents]="frameworkComponents" - > - </ag-grid-angular> - </div> - <div> - <h3 *ngIf="validatedJobs" class="title">Fonctions validées ({{ validatedJobs.length }})</h3> - <ag-grid-angular - *ngIf="validatedJobs" - class="ag-theme-alpine user-table" - rowSelection="multiple" - domLayout="autoHeight" - [rowData]="validatedJobs" - [columnDefs]="columnDefs" - [getRowHeight]="getRowHeight" - [defaultColDef]="defaultColDef" - [frameworkComponents]="frameworkComponents" - > - </ag-grid-angular> - </div> - <div> - <h3 *ngIf="validatedJobs" class="title">Créer une nouvelle fonction</h3> - <form [formGroup]="newJobForm" (ngSubmit)="onSubmit()"> - <input type="text" maxlength="100" formControlName="job" class="form-input" /> - <button type="submit" [ngClass]="{ invalid: !newJobForm.valid }">Créer</button> - </form> - </div> +<div class="adminLayout"> + <h3 *ngIf="unvalidatedJobs" class="title">Fonctions non validées ({{ unvalidatedJobs.length }})</h3> + <ag-grid-angular + *ngIf="unvalidatedJobs" + class="ag-theme-alpine user-table" + rowSelection="multiple" + domLayout="autoHeight" + style="width: 100%" + [rowData]="unvalidatedJobs" + [columnDefs]="unvalidJobsColumnDefs" + [getRowHeight]="getRowHeight" + [defaultColDef]="unvalidColDef" + [frameworkComponents]="frameworkComponents" + > + </ag-grid-angular> + + <h3 *ngIf="validatedJobs" class="title">Fonctions validées ({{ validatedJobs.length }})</h3> + <ag-grid-angular + *ngIf="validatedJobs" + class="ag-theme-alpine user-table" + rowSelection="multiple" + domLayout="autoHeight" + style="width: 100%" + [rowData]="validatedJobs" + [columnDefs]="columnDefs" + [getRowHeight]="getRowHeight" + [defaultColDef]="defaultColDef" + [frameworkComponents]="frameworkComponents" + > + </ag-grid-angular> + + <h3 *ngIf="validatedJobs" class="title">Créer une nouvelle fonction</h3> + <form [formGroup]="newJobForm" (ngSubmit)="onSubmit()"> + <input type="text" maxlength="100" formControlName="job" class="form-input" /> + <button type="submit" [ngClass]="{ invalid: !newJobForm.valid }">Créer</button> + </form> </div> <app-modal-confirmation *ngIf="jobToDelete" diff --git a/src/app/admin/components/manage-jobs/manage-jobs.component.scss b/src/app/admin/components/manage-jobs/manage-jobs.component.scss index 27ad71aba..31e29570c 100644 --- a/src/app/admin/components/manage-jobs/manage-jobs.component.scss +++ b/src/app/admin/components/manage-jobs/manage-jobs.component.scss @@ -7,7 +7,6 @@ } .tables-list { - height: 100%; width: 80%; display: flex; flex-direction: column; diff --git a/src/app/admin/components/manage-jobs/manage-jobs.component.ts b/src/app/admin/components/manage-jobs/manage-jobs.component.ts index 627b77bb9..fa7a05715 100644 --- a/src/app/admin/components/manage-jobs/manage-jobs.component.ts +++ b/src/app/admin/components/manage-jobs/manage-jobs.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; -import { ValueGetterParams } from 'ag-grid-community'; +import { ColDef, ValueGetterParams } from 'ag-grid-community'; import { Job } from '../../../models/job.model'; import { NotificationService } from '../../../services/notification.service'; import { AdminService } from '../../services/admin.service'; @@ -13,7 +13,7 @@ import { ValidateJobComponent } from './validate-job/validate-job.component'; @Component({ selector: 'app-admin-manage-jobs', templateUrl: './manage-jobs.component.html', - styleUrls: ['./manage-jobs.component.scss'], + styleUrls: ['../../admin.scss'], }) export class ManageJobsComponent implements OnInit { public newJobForm: UntypedFormGroup; @@ -33,10 +33,8 @@ export class ManageJobsComponent implements OnInit { }; public contextRow: any; - public columnDefs; - public unvalidJobsColumnDefs; public frameworkComponents; - public defaultColDef = { + public defaultColDef: ColDef = { editable: true, sortable: true, flex: 1, @@ -44,12 +42,100 @@ export class ManageJobsComponent implements OnInit { filter: true, resizable: true, }; - public unvalidColDef = { + public unvalidColDef: ColDef = { ...this.defaultColDef, cellStyle: { color: '#da6c2e', }, }; + public columnDefs: ColDef<Job>[] = [ + { + headerName: 'Fonction', + field: 'name', + editable: true, + onCellValueChanged: this.onChange.bind(this), + }, + { + headerName: 'Offre de service', + field: 'hasPersonalOffer', + cellRenderer: 'jobPersonalOffer', + cellEditor: 'agSelectCellEditor', + valueGetter: this.translateBoolean, + singleClickEdit: true, + cellEditorParams: { + values: [true, false], + }, + onCellValueChanged: this.onChange.bind(this), + }, + { + headerName: 'Acteurs rattachés', + cellRenderer: 'attachedUsersComponent', + cellRendererParams: { + users: 'users', + }, + minWidth: 500, + }, + { + headerName: 'Suppression', + editable: false, + minWidth: 100, + cellRenderer: 'deleteJobComponent', + cellRendererParams: { + onClick: this.onDeleteButtonClick.bind(this), + label: 'Supprimer', + }, + }, + ]; + public unvalidJobsColumnDefs: ColDef<Job>[] = [ + { + headerName: 'Fonction', + field: 'name', + editable: true, + onCellValueChanged: this.onChange.bind(this), + }, + { + headerName: 'Offre de service', + field: 'hasPersonalOffer', + cellRenderer: 'jobPersonalOffer', + cellEditor: 'agSelectCellEditor', + valueGetter: this.translateBoolean, + singleClickEdit: true, + cellEditorParams: { + values: [true, false], + cellEditorPopup: true, + }, + onCellValueChanged: this.onChange.bind(this), + }, + { + headerName: 'Acteurs rattachés', + cellRenderer: 'attachedUsersComponent', + cellRendererParams: { + users: 'users', + }, + minWidth: 500, + }, + { + headerName: 'Fusionner', + field: '_id', + cellRenderer: 'jobRenderer', + cellEditor: 'agSelectCellEditor', + singleClickEdit: true, + cellEditorParams: { + values: this.validatedJobsName, + }, + onCellValueChanged: this.onMerge.bind(this), + }, + { + headerName: 'Valider', + editable: false, + minWidth: 100, + cellRenderer: 'validateJobComponent', + cellRendererParams: { + onClick: this.onValidateButtonClick.bind(this), + label: 'Valider', + }, + }, + ]; constructor( private adminService: AdminService, @@ -58,94 +144,7 @@ export class ManageJobsComponent implements OnInit { ) { this.findValidatedJobs(); this.findUnvalidatedJobs(); - this.unvalidJobsColumnDefs = [ - { - headerName: 'Fonction', - field: 'name', - editable: true, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Offre de service', - field: 'hasPersonalOffer', - cellRenderer: 'jobPersonalOffer', - cellEditor: 'agSelectCellEditor', - valueGetter: this.translateBoolean, - singleClickEdit: true, - cellEditorParams: { - values: [true, false], - cellEditorPopup: true, - }, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Acteurs rattachés', - cellRenderer: 'attachedUsersComponent', - cellRendererParams: { - users: 'users', - }, - minWidth: 500, - }, - { - headerName: 'Fusionner', - field: '_id', - cellRenderer: 'jobRenderer', - cellEditor: 'agSelectCellEditor', - singleClickEdit: true, - cellEditorParams: { - values: this.validatedJobsName, - }, - onCellValueChanged: this.onMerge.bind(this), - }, - { - headerName: 'Valider', - editable: false, - minWidth: 100, - cellRenderer: 'validateJobComponent', - cellRendererParams: { - onClick: this.onValidateButtonClick.bind(this), - label: 'Valider', - }, - }, - ]; - this.columnDefs = [ - { - headerName: 'Fonction', - field: 'name', - editable: true, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Offre de service', - field: 'hasPersonalOffer', - cellRenderer: 'jobPersonalOffer', - cellEditor: 'agSelectCellEditor', - valueGetter: this.translateBoolean, - singleClickEdit: true, - cellEditorParams: { - values: [true, false], - }, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Acteurs rattachés', - cellRenderer: 'attachedUsersComponent', - cellRendererParams: { - users: 'users', - }, - minWidth: 500, - }, - { - headerName: 'Suppression', - editable: false, - minWidth: 100, - cellRenderer: 'deleteJobComponent', - cellRendererParams: { - onClick: this.onDeleteButtonClick.bind(this), - label: 'Supprimer', - }, - }, - ]; + this.frameworkComponents = { jobRenderer: JobRendererComponent, jobPersonalOffer: JobPersonalOfferComponent, diff --git a/src/app/admin/components/manage-users/manage-users.component.html b/src/app/admin/components/manage-users/manage-users.component.html index 6ef12e939..b3068c147 100644 --- a/src/app/admin/components/manage-users/manage-users.component.html +++ b/src/app/admin/components/manage-users/manage-users.component.html @@ -1,3 +1,4 @@ +<app-admin-nav-bar /> <div fxLayout="column" fxLayoutGap="5px" fxLayoutAlign="center center" class="userBlock"> <h2> Gestion des utilisateurs @@ -7,64 +8,59 @@ </h2> </div> -<div class="tables-list"> - <div> - <h3 *ngIf="unVerifiedUsers" class="title">Utilisateurs non vérifiés ({{ unVerifiedUsers.length }})</h3> - <ag-grid-angular - *ngIf="validatedJobs && validatedEmployers" - class="ag-theme-alpine user-table" - rowSelection="multiple" - domLayout="autoHeight" - [rowData]="unVerifiedUsers" - [columnDefs]="columnDefs" - [getRowHeight]="getRowHeight" - [defaultColDef]="unAttachedColDef" - [frameworkComponents]="frameworkComponents" - > - </ag-grid-angular> - </div> - <div> - <h3 *ngIf="unAttachedUsers" class="title"> - Utilisateurs non rattachés ({{ unAttachedUsers.length }}) - <app-button - [text]="'Exporter'" - [style]="buttonTypeEnum.Tertiary" - (click)="exportUsers('unattached')" - /> - </h3> - <ag-grid-angular - *ngIf="validatedJobs && validatedEmployers" - class="ag-theme-alpine user-table" - rowSelection="multiple" - domLayout="autoHeight" - [rowData]="unAttachedUsers" - [columnDefs]="columnDefsUnattached" - [getRowHeight]="getRowHeight" - [defaultColDef]="unAttachedColDef" - [frameworkComponents]="frameworkComponents" - (gridReady)="onGridReady($event, 'unattached')" - > - </ag-grid-angular> - </div> - <div> - <h3 *ngIf="attachedUsers" class="title"> - Utilisateurs rattachés ({{ attachedUsers.length }}) - <app-button [text]="'Exporter'" [style]="buttonTypeEnum.Tertiary" (click)="exportUsers('attached')"/> - </h3> - <ag-grid-angular - *ngIf="validatedJobs && validatedEmployers" - class="ag-theme-alpine user-table" - rowSelection="multiple" - domLayout="autoHeight" - [rowData]="attachedUsers" - [columnDefs]="columnDefs" - [getRowHeight]="getRowHeight" - [defaultColDef]="defaultColDef" - [frameworkComponents]="frameworkComponents" - (gridReady)="onGridReady($event, 'attached')" - > - </ag-grid-angular> - </div> +<div class="adminLayout"> + <h3 *ngIf="unVerifiedUsers" class="title">Utilisateurs non vérifiés ({{ unVerifiedUsers.length }})</h3> + <ag-grid-angular + *ngIf="validatedJobs && validatedEmployers" + class="ag-theme-alpine user-table" + rowSelection="multiple" + domLayout="autoHeight" + style="width: 100%" + [rowData]="unVerifiedUsers" + [columnDefs]="columnDefs" + [defaultColDef]="unAttachedColDef" + [getRowHeight]="getRowHeight" + [frameworkComponents]="frameworkComponents" + > + </ag-grid-angular> + + <h3 *ngIf="unAttachedUsers" class="title"> + Utilisateurs non rattachés ({{ unAttachedUsers.length }}) + <app-button [text]="'Exporter'" [style]="buttonTypeEnum.Tertiary" (click)="exportUsers('unattached')" /> + </h3> + <ag-grid-angular + *ngIf="validatedJobs && validatedEmployers" + class="ag-theme-alpine user-table" + rowSelection="multiple" + domLayout="autoHeight" + style="width: 100%" + [rowData]="unAttachedUsers" + [columnDefs]="columnDefsUnattached" + [getRowHeight]="getRowHeight" + [defaultColDef]="unAttachedColDef" + [frameworkComponents]="frameworkComponents" + (gridReady)="onGridReady($event, 'unattached')" + > + </ag-grid-angular> + + <h3 *ngIf="attachedUsers" class="title"> + Utilisateurs rattachés ({{ attachedUsers.length }}) + <app-button [text]="'Exporter'" [style]="buttonTypeEnum.Tertiary" (click)="exportUsers('attached')" /> + </h3> + <ag-grid-angular + *ngIf="validatedJobs && validatedEmployers" + class="ag-theme-alpine user-table" + rowSelection="multiple" + domLayout="autoHeight" + style="width: 100%" + [rowData]="attachedUsers" + [columnDefs]="columnDefs" + [getRowHeight]="getRowHeight" + [defaultColDef]="defaultColDef" + [frameworkComponents]="frameworkComponents" + (gridReady)="onGridReady($event, 'attached')" + > + </ag-grid-angular> </div> <app-modal-confirmation *ngIf="userToDelete" diff --git a/src/app/admin/components/manage-users/manage-users.component.scss b/src/app/admin/components/manage-users/manage-users.component.scss index 94d422005..b599dea1d 100644 --- a/src/app/admin/components/manage-users/manage-users.component.scss +++ b/src/app/admin/components/manage-users/manage-users.component.scss @@ -7,7 +7,6 @@ } .tables-list { - height: 100%; width: 80%; display: flex; flex-direction: column; diff --git a/src/app/admin/components/manage-users/manage-users.component.ts b/src/app/admin/components/manage-users/manage-users.component.ts index 009c7c344..e3f20df86 100644 --- a/src/app/admin/components/manage-users/manage-users.component.ts +++ b/src/app/admin/components/manage-users/manage-users.component.ts @@ -1,5 +1,5 @@ import { Component } from '@angular/core'; -import { CsvExportParams, GridApi, GridReadyEvent } from 'ag-grid-community'; +import { ColDef, CsvExportParams, GridApi, GridReadyEvent } from 'ag-grid-community'; import { Employer } from '../../../models/employer.model'; import { Job } from '../../../models/job.model'; import { User } from '../../../models/user.model'; @@ -16,7 +16,7 @@ type UsersStatus = 'attached' | 'unattached'; @Component({ selector: 'app-admin-manage-users', templateUrl: './manage-users.component.html', - styleUrls: ['./manage-users.component.scss'], + styleUrls: ['../../admin.scss'], }) export class ManageUsersComponent { public attachedUsers: User[] = []; @@ -41,11 +41,9 @@ export class ManageUsersComponent { { name: null, validated: false }, ]; public contextRow: any; - - public columnDefs; - public columnDefsUnattached; + public buttonTypeEnum = ButtonType; public frameworkComponents; - public defaultColDef = { + public defaultColDef: ColDef = { editable: true, sortable: true, flex: 1, @@ -53,83 +51,84 @@ export class ManageUsersComponent { filter: true, resizable: true, }; - public unAttachedColDef = { + public unAttachedColDef: ColDef = { ...this.defaultColDef, cellStyle: { color: '#da6c2e', }, }; - public buttonTypeEnum = ButtonType; - constructor(private adminService: AdminService, private notificationService: NotificationService) { - this.findValidatedJobs(); - this.findValidatedEmployers(); - this.columnDefs = [ - { - headerName: 'Nom', - field: 'surname', - }, - { - headerName: 'Prénom', - field: 'name', - }, - { - minWidth: 150, - headerName: 'Mail', - field: 'email', - }, - { - minWidth: 100, - headerName: 'Téléphone', - field: 'phone', - }, - { - headerName: 'Structures administrées', - cellRenderer: 'administredStructuresComponent', - cellRendererParams: { - structures: 'structures', - }, - minWidth: 350, - }, - { - headerName: 'Fonction', - field: 'job', - cellRenderer: 'jobRenderer', - cellEditor: 'agSelectCellEditor', - // Ag select cell editor doesn't accept an object a parameter. - // Only giving name to display in the select, then recompose the full object when filter on change. - cellEditorParams: { - values: this.validatedJobsName, - }, - onCellValueChanged: this.onJobChange.bind(this), + public columnDefsUnattached: ColDef<User>[]; + public columnDefs: ColDef<User>[] = [ + { + headerName: 'Nom', + field: 'surname', + }, + { + headerName: 'Prénom', + field: 'name', + }, + { + minWidth: 150, + headerName: 'Mail', + field: 'email', + }, + { + minWidth: 100, + headerName: 'Téléphone', + field: 'phone', + }, + { + headerName: 'Structures administrées', + cellRenderer: 'administredStructuresComponent', + cellRendererParams: { + structures: 'structures', }, - { - headerName: 'Employeur', - field: 'employer', - cellRenderer: 'employerRenderer', - cellEditor: 'agSelectCellEditor', - cellEditorParams: { - values: this.validatedEmployersName, - }, - onCellValueChanged: this.onEmployerChange.bind(this), + minWidth: 350, + }, + { + headerName: 'Fonction', + field: 'job', + cellRenderer: 'jobRenderer', + cellEditor: 'agSelectCellEditor', + // Ag select cell editor doesn't accept an object a parameter. + // Only giving name to display in the select, then recompose the full object when filter on change. + cellEditorParams: { + values: this.validatedJobsName, }, - { - headerName: 'Date de création', - field: 'createdAt', - minWidth: 150, + onCellValueChanged: this.onJobChange.bind(this), + }, + { + headerName: 'Employeur', + field: 'employer', + cellRenderer: 'employerRenderer', + cellEditor: 'agSelectCellEditor', + cellEditorParams: { + values: this.validatedEmployersName, }, - { - headerName: 'Actions', - editable: false, - minWidth: 150, - cellRenderer: 'deleteUserComponent', - cellRendererParams: { - onClick: this.onDeleteButtonClick.bind(this), - label: 'Supprimer', - }, - cellStyle: { 'text-align': 'center' }, + onCellValueChanged: this.onEmployerChange.bind(this), + }, + { + headerName: 'Date de création', + field: 'createdAt', + minWidth: 150, + }, + { + headerName: 'Actions', + editable: false, + minWidth: 150, + cellRenderer: 'deleteUserComponent', + cellRendererParams: { + onClick: this.onDeleteButtonClick.bind(this), + label: 'Supprimer', }, - ]; + cellStyle: { 'text-align': 'center' }, + }, + ]; + + constructor(private adminService: AdminService, private notificationService: NotificationService) { + this.findValidatedJobs(); + this.findValidatedEmployers(); this.columnDefsUnattached = [...this.columnDefs]; this.columnDefsUnattached = this.columnDefsUnattached.filter((item) => String(item.headerName).toLowerCase().indexOf('structure') diff --git a/src/app/admin/components/nav-bar/nav-bar.component.html b/src/app/admin/components/nav-bar/nav-bar.component.html new file mode 100644 index 000000000..dcc0fe9df --- /dev/null +++ b/src/app/admin/components/nav-bar/nav-bar.component.html @@ -0,0 +1,41 @@ +<div fxLayout="column" fxLayoutGap="20px" class="content-container"> + <div fxLayout="row" fxLayoutAlign="center center"><h1>Administration</h1></div> + <div fxLayout="row" fxLayoutGap="20px" fxLayoutAlign="center center"> + <app-button + [text]="'Revendication structure'" + [style]="buttonTypeEnum.Secondary" + (click)="router.navigateByUrl(routes.pendingStructures.link)" + /> + <app-button + [text]="'Liste structures'" + [style]="buttonTypeEnum.Secondary" + (click)="router.navigateByUrl(routes.structuresList.link)" + /> + <app-button + [text]="'Structures supprimées'" + [style]="buttonTypeEnum.Secondary" + (click)="router.navigateByUrl(routes.deletedStructures.link)" + /> + <app-button + [text]="'Gestion des utilisateurs'" + [style]="buttonTypeEnum.Secondary" + (click)="router.navigateByUrl(routes.manageUsers.link)" + /> + <app-button + [text]="'Fonctions'" + [style]="buttonTypeEnum.Secondary" + (click)="router.navigateByUrl(routes.jobsList.link)" + /> + <app-button + [text]="'Employeurs'" + [style]="buttonTypeEnum.Secondary" + (click)="router.navigateByUrl(routes.employersList.link)" + /> + <app-button + [text]="'Infos covid'" + [style]="buttonTypeEnum.Secondary" + (click)="router.navigateByUrl(routes.lockdownInfo.link)" + /> + <a target="_blank" class="custom-link" rel="noopener noreferrer" [href]="ghostLink">Ghost</a> + </div> +</div> diff --git a/src/app/admin/components/nav-bar/nav-bar.component.ts b/src/app/admin/components/nav-bar/nav-bar.component.ts new file mode 100644 index 000000000..d1b0fc662 --- /dev/null +++ b/src/app/admin/components/nav-bar/nav-bar.component.ts @@ -0,0 +1,17 @@ +import { Component } from '@angular/core'; +import { Router } from '@angular/router'; +import { RuntimeConfigLoaderService } from 'runtime-config-loader'; +import { ButtonType } from '../../../shared/components/button/buttonType.enum'; +import { AdminRoutes } from '../../admin-routing.module'; + +@Component({ + selector: 'app-admin-nav-bar', + templateUrl: './nav-bar.component.html', +}) +export class NavBarComponent { + public ghostLink = this.runtimeConfigLoaderService.getConfigObjectKey('ghostAdmin'); + public buttonTypeEnum = ButtonType; + public routes = AdminRoutes; + + constructor(private runtimeConfigLoaderService: RuntimeConfigLoaderService, public router: Router) {} +} diff --git a/src/app/admin/components/panel/panel.component.html b/src/app/admin/components/panel/panel.component.html deleted file mode 100644 index 4afbd9a95..000000000 --- a/src/app/admin/components/panel/panel.component.html +++ /dev/null @@ -1,45 +0,0 @@ -<div fxLayout="column" fxLayoutGap="20px" class="content-container full-screen"> - <div fxLayout="row" fxLayoutAlign="center center"><h1>Administration</h1></div> - <div fxLayout="row" fxLayoutGap="20px" fxLayoutAlign="center center"> - <app-button - [text]="'Revendication structure'" - [style]="buttonTypeEnum.Secondary" - (click)="changeActiveFeature(tab.pendingStructures)" - /> - <app-button - [text]="'Liste structures'" - [style]="buttonTypeEnum.Secondary" - (click)="changeActiveFeature(tab.structuresList)" - /> - <app-button - [text]="'Structures supprimées'" - [style]="buttonTypeEnum.Secondary" - (click)="changeActiveFeature(tab.deletedStructures)" - /> - <app-button - [text]="'Gestion des utilisateurs'" - [style]="buttonTypeEnum.Secondary" - (click)="changeActiveFeature(tab.manageUsers)" - /> - <app-button - [text]="'Infos covid'" - [style]="buttonTypeEnum.Secondary" - (click)="changeActiveFeature(tab.lockdownInfo)" - /> - <app-button [text]="'Fonctions'" [style]="buttonTypeEnum.Secondary" (click)="changeActiveFeature(tab.jobsList)" /> - <app-button - [text]="'Employeurs'" - [style]="buttonTypeEnum.Secondary" - (click)="changeActiveFeature(tab.employersList)" - /> - <a target="_blank" class="custom-link" rel="noopener noreferrer" [href]="ghostLink">Ghost</a> - </div> - - <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.spec.ts b/src/app/admin/components/panel/panel.component.spec.ts deleted file mode 100644 index b0f6a9d73..000000000 --- a/src/app/admin/components/panel/panel.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - -import { PanelComponent } from './panel.component'; - -describe('PanelComponent', () => { - let component: PanelComponent; - let fixture: ComponentFixture<PanelComponent>; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ PanelComponent ] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(PanelComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/components/panel/panel.component.ts b/src/app/admin/components/panel/panel.component.ts deleted file mode 100644 index 94b1bde1c..000000000 --- a/src/app/admin/components/panel/panel.component.ts +++ /dev/null @@ -1,30 +0,0 @@ -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'; -import { PanelRouteService } from '../../services/panel-route.service'; - -@Component({ - selector: 'app-admin-panel', - templateUrl: './panel.component.html', - providers: [PanelRouteService], -}) -export class PanelComponent { - public ghostLink = this.runtimeConfigLoaderService.getConfigObjectKey('ghostAdmin'); - public selectedTab = AdminPanelEnum.pendingStructures; - public tab = AdminPanelEnum; - public buttonTypeEnum = ButtonType; - - constructor( - private panelRouteService: PanelRouteService, - private runtimeConfigLoaderService: RuntimeConfigLoaderService - ) { - this.panelRouteService.destinationChanged$.subscribe((selected: AdminPanelEnum) => { - this.selectedTab = selected; - }); - } - - public changeActiveFeature(newFeature: AdminPanelEnum): void { - this.selectedTab = newFeature; - } -} diff --git a/src/app/admin/components/structures-list/admin-structures-list.component.html b/src/app/admin/components/structures-list/admin-structures-list.component.html index cf8bb2038..ea5d3a133 100644 --- a/src/app/admin/components/structures-list/admin-structures-list.component.html +++ b/src/app/admin/components/structures-list/admin-structures-list.component.html @@ -1,82 +1,55 @@ +<app-admin-nav-bar /> <div *ngIf="isLoading" class="loader"> <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt /> </div> -<div *ngIf="!isLoading" fxLayout="column" fxLayoutAlign="center center"> +<div *ngIf="!isLoading" class="adminLayout" fxLayout="column" fxLayoutAlign="center center"> <h2>Liste structures</h2> - <table aria-describedby="demands attachment results" class="results-tab results-column"> - <thead> - <th colspan="2" scope="colgroup"> - Structures avec des données manquantes ({{ structuresIncomplete ? structuresIncomplete.length : 0 }}) - </th> - </thead> - <tbody> - <tr *ngFor="let structure of structuresIncomplete"> - <td> - <a class="incomplete" target="_blank" href="/acteurs?id={{ structure.structureId }}"> - {{ structure.structureName }} - </a> - </td> - <td class="structure-updated-at"> - <span [ngClass]="{ isOutdated: structure.isOutdated }">{{ structure.updatedAt | date: 'mediumDate' }}</span> - </td> - </tr> - <tr *ngIf="!structuresIncomplete?.length"> - <td colspan="3">Aucune structure</td> - </tr> - </tbody> - </table> - <table aria-describedby="demands attachment results" class="results-tab results-column"> - <thead> - <th colspan="2" scope="colgroup">Structures en cours de revendication ({{ structuresInClaim.length }})</th> - </thead> - <tbody> - <tr *ngFor="let structure of structuresInClaim"> - <td> - <a target="_blank" href="/acteurs?id={{ structure.structureId }}">{{ structure.structureName }}</a> - </td> - <td class="structure-updated-at"> - <span [ngClass]="{ isOutdated: structure.isOutdated }">{{ structure.updatedAt | date: 'mediumDate' }}</span> - </td> - </tr> - <tr *ngIf="!structuresInClaim?.length"> - <td colspan="3">Aucune structure</td> - </tr> - </tbody> - </table> - <table aria-describedby="demands attachment results" class="results-tab results-column"> - <thead> - <th colspan="2" scope="colgroup">Structures à revendiquer ({{ structuresToClaim.length }})</th> - </thead> - <tbody> - <tr *ngFor="let structure of structuresToClaim"> - <td> - <a target="_blank" href="/acteurs?id={{ structure.structureId }}">{{ structure.structureName }}</a> - </td> - <td class="structure-updated-at"> - <span [ngClass]="{ isOutdated: structure.isOutdated }">{{ structure.updatedAt | date: 'mediumDate' }}</span> - </td> - </tr> - <tr *ngIf="!structuresToClaim?.length"> - <td colspan="3">Aucune structure</td> - </tr> - </tbody> - </table> - <table aria-describedby="demands attachment results" class="results-tab results-column"> - <thead> - <th colspan="2" scope="colgroup">Structures revendiquées ({{ structuresClaimed.length }})</th> - </thead> - <tbody> - <tr *ngFor="let structure of structuresClaimed"> - <td> - <a target="_blank" href="/acteurs?id={{ structure.structureId }}">{{ structure.structureName }}</a> - </td> - <td class="structure-updated-at"> - <span [ngClass]="{ isOutdated: structure.isOutdated }">{{ structure.updatedAt | date: 'mediumDate' }}</span> - </td> - </tr> - <tr *ngIf="!structuresClaimed?.length"> - <td colspan="3">Aucune structure</td> - </tr> - </tbody> - </table> + <h3>Structures avec des données manquantes ({{ structuresIncomplete ? structuresIncomplete.length : 0 }})</h3> + <ag-grid-angular + *ngIf="structuresIncomplete.length" + class="ag-theme-alpine" + domLayout="autoHeight" + style="width: 100%" + [rowData]="structuresIncomplete" + [columnDefs]="columnDefs" + [rowHeight]="rowHeight" + [ngClass]="'red'" + /> + <div *ngIf="!structuresIncomplete?.length">Aucune structure</div> + + <h3>Structures en cours de revendication ({{ structuresInClaim.length }})</h3> + <ag-grid-angular + *ngIf="structuresInClaim.length" + class="ag-theme-alpine" + domLayout="autoHeight" + style="width: 100%" + [rowData]="structuresInClaim" + [columnDefs]="columnDefs" + [rowHeight]="rowHeight" + /> + <div *ngIf="!structuresInClaim?.length">Aucune structure</div> + + <h3>Structures à revendiquer ({{ structuresToClaim.length }})</h3> + <ag-grid-angular + *ngIf="structuresToClaim.length" + class="ag-theme-alpine" + domLayout="autoHeight" + style="width: 100%" + [rowData]="structuresToClaim" + [columnDefs]="columnDefs" + [rowHeight]="rowHeight" + /> + <div *ngIf="!structuresToClaim?.length">Aucune structure</div> + + <h3>Structures revendiquées ({{ structuresClaimed.length }})</h3> + <ag-grid-angular + *ngIf="structuresClaimed.length" + class="ag-theme-alpine" + domLayout="autoHeight" + style="width: 100%" + [rowData]="structuresClaimed" + [columnDefs]="columnDefs" + [rowHeight]="rowHeight" + /> + <div *ngIf="!structuresClaimed?.length">Aucune structure</div> </div> diff --git a/src/app/admin/components/structures-list/admin-structures-list.component.ts b/src/app/admin/components/structures-list/admin-structures-list.component.ts index 3127ba460..15a8dc0fc 100644 --- a/src/app/admin/components/structures-list/admin-structures-list.component.ts +++ b/src/app/admin/components/structures-list/admin-structures-list.component.ts @@ -1,4 +1,7 @@ +import { DatePipe } from '@angular/common'; import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { ColDef } from 'ag-grid-community'; import { finalize } from 'rxjs/operators'; import { AdminStructure } from '../../models/adminStructureList.interface'; import { AdminService } from '../../services/admin.service'; @@ -6,7 +9,7 @@ import { AdminService } from '../../services/admin.service'; @Component({ selector: 'app-admin-structures-list', templateUrl: './admin-structures-list.component.html', - styleUrls: ['../../admin-pannel.scss'], + styleUrls: ['../../admin.scss'], }) export class AdminStructuresListComponent implements OnInit { public structuresClaimed: AdminStructure[]; @@ -15,7 +18,8 @@ export class AdminStructuresListComponent implements OnInit { public structuresIncomplete: AdminStructure[]; public isAll: boolean = false; public isLoading: boolean = true; - constructor(private adminService: AdminService) {} + public rowHeight = 25; + constructor(private adminService: AdminService, private datePipe: DatePipe, private router: Router) {} ngOnInit(): void { this.adminService @@ -28,4 +32,30 @@ export class AdminStructuresListComponent implements OnInit { this.structuresIncomplete = response.incomplete; }); } + + private renderLink(structureId: string, structureName: string) { + return `<a href="/acteurs?id=${structureId}" target="_blank">${structureName}</a>`; + } + + public columnDefs: ColDef<AdminStructure>[] = [ + { + headerName: 'Structure', + cellRenderer: (params) => this.renderLink(params.data.structureId, params.data.structureName), + comparator(_, __, nodeA, nodeB) { + return nodeA.data.structureName.toLowerCase() > nodeB.data.structureName.toLocaleLowerCase() ? -1 : 1; + }, + sortable: true, + flex: 3, + }, + { + headerName: 'Date de mise à jour', + field: 'updatedAt', + valueFormatter: ({ value }) => this.datePipe.transform(value, 'mediumDate'), + cellClass: (params) => { + return params.data.isOutdated ? 'red' : ''; + }, + flex: 1, + sortable: true, + }, + ]; } diff --git a/src/app/admin/services/panel-route.service.ts b/src/app/admin/services/panel-route.service.ts deleted file mode 100644 index 111a50102..000000000 --- a/src/app/admin/services/panel-route.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Subject } from 'rxjs'; -import { AdminPanelEnum } from '../../shared/enum/adminPanel.enum'; - -@Injectable() -export class PanelRouteService { - private destination = new Subject<AdminPanelEnum>(); - - destinationChanged$ = this.destination.asObservable(); - - redirectTo(dest: AdminPanelEnum) { - this.destination.next(dest); - } -} diff --git a/src/app/shared/enum/adminPanel.enum.ts b/src/app/shared/enum/adminPanel.enum.ts deleted file mode 100644 index 8432a8294..000000000 --- a/src/app/shared/enum/adminPanel.enum.ts +++ /dev/null @@ -1,9 +0,0 @@ -export enum AdminPanelEnum { - deletedStructures, - employersList, - jobsList, - lockdownInfo, - manageUsers, - pendingStructures, - structuresList, -} -- GitLab From 71225f5d17227467cdae1ec41b8a812b5f9c758b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marl=C3=A8ne=20SIMONDANT?= <msimondant@grandlyon.com> Date: Wed, 19 Apr 2023 08:08:09 +0000 Subject: [PATCH 20/47] fix(header): on mobile, profile icon didn't open menu --- src/app/header/header.component.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html index da9643c6c..d5c43742a 100644 --- a/src/app/header/header.component.html +++ b/src/app/header/header.component.html @@ -21,7 +21,15 @@ /> </div> <div class="containerIconMenu"> - <app-svg-icon [type]="'ico'" [icon]="'profile'" [iconClass]="'icon-32'" /> + <app-svg-icon + class="clickable" + tabindex="0" + [type]="'ico'" + [icon]="'profile'" + [iconClass]="'icon-32'" + (click)="isLoggedIn ? openProfileMenu() : goToLoginPage()" + (keyup.enter)="isLoggedIn ? openProfileMenu() : goToLoginPage()" + /> </div> <div fxLayout="row" class="right-header" fxLayoutAlign="center center" fxLayoutGap="3vw"> <a routerLink="/news" [routerLinkActive]="'active'" i18n>Actualités</a> -- GitLab From aefb7d6be9bd6a8bac8fbfbc5f10ec7937b0ae28 Mon Sep 17 00:00:00 2001 From: Marlene Simondant <msimondant@grandlyon.com> Date: Wed, 19 Apr 2023 11:08:07 +0200 Subject: [PATCH 21/47] fix(carto): filters display missing margins --- .../components/more-filters/more-filters.component.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/structure-list/components/more-filters/more-filters.component.scss b/src/app/structure-list/components/more-filters/more-filters.component.scss index e2fa32079..d63fe1926 100644 --- a/src/app/structure-list/components/more-filters/more-filters.component.scss +++ b/src/app/structure-list/components/more-filters/more-filters.component.scss @@ -66,6 +66,7 @@ margin: auto; } .scroll-container { + display: contents; height: 40vh; max-height: 390px; overflow-y: scroll; -- GitLab From d8c7a062026ad81c915d046b80946870a6f5168a Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Wed, 19 Apr 2023 12:16:34 +0000 Subject: [PATCH 22/47] fix(admin): merge jobs --- .../manage-jobs/manage-jobs.component.ts | 102 +++++++++--------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/src/app/admin/components/manage-jobs/manage-jobs.component.ts b/src/app/admin/components/manage-jobs/manage-jobs.component.ts index fa7a05715..9c97fd7d2 100644 --- a/src/app/admin/components/manage-jobs/manage-jobs.component.ts +++ b/src/app/admin/components/manage-jobs/manage-jobs.component.ts @@ -33,6 +33,7 @@ export class ManageJobsComponent implements OnInit { }; public contextRow: any; + public unvalidJobsColumnDefs: ColDef<Job>[]; public frameworkComponents; public defaultColDef: ColDef = { editable: true, @@ -86,56 +87,6 @@ export class ManageJobsComponent implements OnInit { }, }, ]; - public unvalidJobsColumnDefs: ColDef<Job>[] = [ - { - headerName: 'Fonction', - field: 'name', - editable: true, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Offre de service', - field: 'hasPersonalOffer', - cellRenderer: 'jobPersonalOffer', - cellEditor: 'agSelectCellEditor', - valueGetter: this.translateBoolean, - singleClickEdit: true, - cellEditorParams: { - values: [true, false], - cellEditorPopup: true, - }, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Acteurs rattachés', - cellRenderer: 'attachedUsersComponent', - cellRendererParams: { - users: 'users', - }, - minWidth: 500, - }, - { - headerName: 'Fusionner', - field: '_id', - cellRenderer: 'jobRenderer', - cellEditor: 'agSelectCellEditor', - singleClickEdit: true, - cellEditorParams: { - values: this.validatedJobsName, - }, - onCellValueChanged: this.onMerge.bind(this), - }, - { - headerName: 'Valider', - editable: false, - minWidth: 100, - cellRenderer: 'validateJobComponent', - cellRendererParams: { - onClick: this.onValidateButtonClick.bind(this), - label: 'Valider', - }, - }, - ]; constructor( private adminService: AdminService, @@ -144,7 +95,56 @@ export class ManageJobsComponent implements OnInit { ) { this.findValidatedJobs(); this.findUnvalidatedJobs(); - + this.unvalidJobsColumnDefs = [ + { + headerName: 'Fonction', + field: 'name', + editable: true, + onCellValueChanged: this.onChange.bind(this), + }, + { + headerName: 'Offre de service', + field: 'hasPersonalOffer', + cellRenderer: 'jobPersonalOffer', + cellEditor: 'agSelectCellEditor', + valueGetter: this.translateBoolean, + singleClickEdit: true, + cellEditorParams: { + values: [true, false], + cellEditorPopup: true, + }, + onCellValueChanged: this.onChange.bind(this), + }, + { + headerName: 'Acteurs rattachés', + cellRenderer: 'attachedUsersComponent', + cellRendererParams: { + users: 'users', + }, + minWidth: 500, + }, + { + headerName: 'Fusionner', + field: '_id', + cellRenderer: 'jobRenderer', + cellEditor: 'agSelectCellEditor', + singleClickEdit: true, + cellEditorParams: { + values: this.validatedJobsName, + }, + onCellValueChanged: this.onMerge.bind(this), + }, + { + headerName: 'Valider', + editable: false, + minWidth: 100, + cellRenderer: 'validateJobComponent', + cellRendererParams: { + onClick: this.onValidateButtonClick.bind(this), + label: 'Valider', + }, + }, + ]; this.frameworkComponents = { jobRenderer: JobRendererComponent, jobPersonalOffer: JobPersonalOfferComponent, -- GitLab From 34acfc51a55e569e211b45b55923b56cd374d1c1 Mon Sep 17 00:00:00 2001 From: Bastien Dumont <bdumont@grandlyon.com> Date: Wed, 19 Apr 2023 14:50:17 +0200 Subject: [PATCH 23/47] chore: remove empty optional parameter --- .../manage-employers.component.ts | 2 +- .../manage-jobs/manage-jobs.component.ts | 4 ++-- .../manage-users/manage-users.component.ts | 2 +- src/app/form/form-view/form-view.component.ts | 2 +- src/app/profile/edit/edit.component.ts | 10 +++++----- src/app/profile/profile.component.ts | 4 ++-- src/app/profile/services/profile.service.ts | 18 ++++++++---------- .../structure-edition-summary.component.ts | 2 +- src/app/services/notification.service.ts | 18 +++++++++--------- 9 files changed, 30 insertions(+), 32 deletions(-) diff --git a/src/app/admin/components/manage-employers/manage-employers.component.ts b/src/app/admin/components/manage-employers/manage-employers.component.ts index dbd7450b5..28b3db9af 100644 --- a/src/app/admin/components/manage-employers/manage-employers.component.ts +++ b/src/app/admin/components/manage-employers/manage-employers.component.ts @@ -144,7 +144,7 @@ export class ManageEmployersComponent implements OnInit { () => { this.findValidatedEmployers(); this.newEmployerForm.reset(); - this.notificationService.showSuccess('Votre employeur a bien été créée', ''); + this.notificationService.showSuccess('Votre employeur a bien été créée'); }, (err) => { this.notificationService.showError(`${err.error.message}`, 'Une erreur est survenue'); diff --git a/src/app/admin/components/manage-jobs/manage-jobs.component.ts b/src/app/admin/components/manage-jobs/manage-jobs.component.ts index 9c97fd7d2..5b673e258 100644 --- a/src/app/admin/components/manage-jobs/manage-jobs.component.ts +++ b/src/app/admin/components/manage-jobs/manage-jobs.component.ts @@ -173,7 +173,7 @@ export class ManageJobsComponent implements OnInit { () => { this.findValidatedJobs(); this.newJobForm.reset(); - this.notificationService.showSuccess('Votre fonction a bien été créée', ''); + this.notificationService.showSuccess('Votre fonction a bien été créée'); }, (err) => { this.notificationService.showError(`${err.error.message}`, 'Une erreur est survenue'); @@ -191,7 +191,7 @@ export class ManageJobsComponent implements OnInit { this.adminService.deleteJob(job._id).subscribe( (data) => { this.validatedJobs = this.validatedJobs.filter((obj) => obj._id !== data._id); - this.notificationService.showSuccess('La fonction a bien été supprimée.', ''); + this.notificationService.showSuccess('La fonction a bien été supprimée.'); }, (err) => { this.notificationService.showError(`${err.error.message}`, 'Une erreur est survenue'); diff --git a/src/app/admin/components/manage-users/manage-users.component.ts b/src/app/admin/components/manage-users/manage-users.component.ts index e3f20df86..5c2cf6c9d 100644 --- a/src/app/admin/components/manage-users/manage-users.component.ts +++ b/src/app/admin/components/manage-users/manage-users.component.ts @@ -161,7 +161,7 @@ export class ManageUsersComponent { arg.node.data[arg.colDef.field] = selectedJob; arg.api.refreshCells({ rowNodes: [arg.node], columns: [arg.column.colId] }); - this.notificationService.showSuccess('La fonction a bien été attribuée.', ''); + this.notificationService.showSuccess('La fonction a bien été attribuée.'); }); return; } diff --git a/src/app/form/form-view/form-view.component.ts b/src/app/form/form-view/form-view.component.ts index 720f12a74..4b4df7531 100644 --- a/src/app/form/form-view/form-view.component.ts +++ b/src/app/form/form-view/form-view.component.ts @@ -389,7 +389,7 @@ export class FormViewComponent implements OnInit, AfterViewInit { public async saveEditedStructure() { this.structureService.editStructure(this.getCurrentChanges(this.currentPage), this.structure._id).subscribe(() => { - this.notificationService.showSuccess('Vos modifications ont bien été prises en compte.', ''); + this.notificationService.showSuccess('Vos modifications ont bien été prises en compte.'); history.back(); }); } diff --git a/src/app/profile/edit/edit.component.ts b/src/app/profile/edit/edit.component.ts index b6a29c94b..3e7790eed 100644 --- a/src/app/profile/edit/edit.component.ts +++ b/src/app/profile/edit/edit.component.ts @@ -263,7 +263,7 @@ export class EditComponent implements OnInit { if (this.emailValid(this.newEmail) && this.newEmail === this.newEmailConfirm) { this.profileService.changeEmail(this.newEmail, this.userProfile.email).subscribe(() => { this.closeModal(); - this.notificationService.showSuccess('Veuillez confirmer votre nouvelle adresse grâce au mail envoyé', ''); + this.notificationService.showSuccess('Veuillez confirmer votre nouvelle adresse grâce au mail envoyé'); }); } } @@ -275,13 +275,13 @@ export class EditComponent implements OnInit { .pipe( catchError(async (response: HttpErrorResponse) => { if (response.error.statusCode == 401) { - this.notificationService.showError('Une erreur est survenue', ''); + this.notificationService.showError('Une erreur est survenue'); throw new Error('Une erreur est survenue'); } }) ) .subscribe(() => { - this.notificationService.showSuccess('Votre mot de passe a bien été modifié', ''); + this.notificationService.showSuccess('Votre mot de passe a bien été modifié'); this.closeModal(); }); this.oldPassword = ''; @@ -296,13 +296,13 @@ export class EditComponent implements OnInit { .subscribe( () => { this.profileService.deleteProfile().subscribe(() => { - this.notificationService.showSuccess('Votre compte a bien été supprimé', ''); + this.notificationService.showSuccess('Votre compte a bien été supprimé'); this.closeModal(); this.authService.logout(); }); }, () => { - this.notificationService.showError('Une erreur est survenue', ''); + this.notificationService.showError('Une erreur est survenue'); } ); } diff --git a/src/app/profile/profile.component.ts b/src/app/profile/profile.component.ts index c0a19627b..ccf783c71 100644 --- a/src/app/profile/profile.component.ts +++ b/src/app/profile/profile.component.ts @@ -1,7 +1,7 @@ import { Location } from '@angular/common'; import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { forkJoin, Observable } from 'rxjs'; +import { Observable, forkJoin } from 'rxjs'; import { catchError, map, tap } from 'rxjs/operators'; import { pendingStructureLink } from '../models/pendingStructure.model'; import { StructureWithOwners } from '../models/structureWithOwners.model'; @@ -112,7 +112,7 @@ export class ProfileComponent implements OnInit { next: () => { const index = this.pendingStructures.map((s) => s.structure._id).indexOf(idStructure); this.pendingStructures.splice(index, 1); - this.notificationService.showSuccess('La demande a été annulée avec succès', ''); + this.notificationService.showSuccess('La demande a été annulée avec succès'); }, error: (err) => { this.notificationService.showError(`${err.error.message}`, 'Une erreur est survenue'); diff --git a/src/app/profile/services/profile.service.ts b/src/app/profile/services/profile.service.ts index 0925fa451..a7dea50d1 100644 --- a/src/app/profile/services/profile.service.ts +++ b/src/app/profile/services/profile.service.ts @@ -110,22 +110,20 @@ export class ProfileService { return this.http.post<User>(`${this.baseUrl}/details`, newDetails).pipe( map((user) => user), catchError(() => { - this.notificationService.showError('Une erreur est survenue', ''); + this.notificationService.showError('Une erreur est survenue'); return new Observable<Error>(); }) ); } public updateDescription(description: string): Observable<User | Error> { - return this.http - .post<User>(`${this.baseUrl}/description`, { description }) - .pipe( - map((user) => user), - catchError(() => { - this.notificationService.showError('Une erreur est survenue', ''); - return new Observable<Error>(); - }) - ); + return this.http.post<User>(`${this.baseUrl}/description`, { description }).pipe( + map((user) => user), + catchError(() => { + this.notificationService.showError('Une erreur est survenue'); + return new Observable<Error>(); + }) + ); } public async isPersonalOfferOwner(personalOfferId: string): Promise<boolean> { diff --git a/src/app/profile/structure-edition-summary/structure-edition-summary.component.ts b/src/app/profile/structure-edition-summary/structure-edition-summary.component.ts index f4a6562b4..695642504 100644 --- a/src/app/profile/structure-edition-summary/structure-edition-summary.component.ts +++ b/src/app/profile/structure-edition-summary/structure-edition-summary.component.ts @@ -95,7 +95,7 @@ export class StructureEditionSummaryComponent implements OnInit { public updateStructureUpdateDate(): void { this.structureService.editStructure({}, this.structure._id).subscribe(() => { - this.notificationService.showSuccess('La structure a bien été mise à jour.', ''); + this.notificationService.showSuccess('La structure a bien été mise à jour.'); this.isUpdateStructure = false; }); } diff --git a/src/app/services/notification.service.ts b/src/app/services/notification.service.ts index 11ce28ce7..1ce856f0c 100644 --- a/src/app/services/notification.service.ts +++ b/src/app/services/notification.service.ts @@ -7,24 +7,24 @@ import { ToastrService } from 'ngx-toastr'; export class NotificationService { constructor(private toastr: ToastrService) {} - public showSuccess(message: string, title: string = '', timespan: number = 10000): void { + public showSuccess(message: string, title: string = '', timeOut: number = 10000): void { this.toastr.success(message, title, { - timeOut: timespan, + timeOut: timeOut, }); } - // Par defaut, l'erreur reste affichée jusqu'à ce qu'on clique dessus - public showError(message: string, title: string = '', timespan: number = 0): void { + // Par défaut, l'erreur reste affichée jusqu'à ce qu'on clique dessus + public showError(message: string, title: string = '', timeOut: number = 0): void { this.toastr.error(message, title, { - timeOut: timespan, - disableTimeOut: timespan ? false : true, + timeOut: timeOut, + disableTimeOut: timeOut ? false : true, }); } - public showErrorPleaseRetry(title: string, timespan: number = 0): void { - this.showError('Merci de réessayer plus tard ou de contacter un administrateur', title, timespan); + public showErrorPleaseRetry(title: string, timeOut: number = 0): void { + this.showError('Merci de réessayer plus tard ou de contacter un administrateur', title, timeOut); } - // Par defaut, l'erreur reste affichée jusqu'à ce qu'on clique dessus + // Par défaut, l'erreur reste affichée jusqu'à ce qu'on clique dessus public showAppNewVersion(): void { const update = this.toastr.info( 'Une nouvelle version est disponible, cliquer ici pour mettre à jour.', -- GitLab From f3d25190f1291310a22904834f292b919bb1994a Mon Sep 17 00:00:00 2001 From: Marlene Simondant <msimondant@grandlyon.com> Date: Wed, 19 Apr 2023 15:01:04 +0200 Subject: [PATCH 24/47] fix(structure): change labels in edition mode --- .../structure-edition-summary.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/profile/structure-edition-summary/structure-edition-summary.component.html b/src/app/profile/structure-edition-summary/structure-edition-summary.component.html index 8ea5d439e..022bd153d 100644 --- a/src/app/profile/structure-edition-summary/structure-edition-summary.component.html +++ b/src/app/profile/structure-edition-summary/structure-edition-summary.component.html @@ -378,7 +378,7 @@ <div class="section proceduresAccompaniment"> <div class="sectionHeader"> - <p>Aide au numérique</p> + <p>Démarches en ligne</p> <app-button class="hide-on-mobile" [text]="'Modifier'" @@ -430,7 +430,7 @@ <div class="section learning"> <div class="sectionHeader"> - <p>Formation au numérique proposés</p> + <p>Compétences numériques</p> <app-button class="hide-on-mobile" [text]="'Modifier'" -- GitLab From ab1c6423362cce520779f2d2c62824370c0f1f39 Mon Sep 17 00:00:00 2001 From: Marlene Simondant <msimondant@grandlyon.com> Date: Thu, 20 Apr 2023 10:14:03 +0200 Subject: [PATCH 25/47] fix(carto): more filters modal height --- .../components/more-filters/more-filters.component.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/structure-list/components/more-filters/more-filters.component.scss b/src/app/structure-list/components/more-filters/more-filters.component.scss index d63fe1926..e2fa32079 100644 --- a/src/app/structure-list/components/more-filters/more-filters.component.scss +++ b/src/app/structure-list/components/more-filters/more-filters.component.scss @@ -66,7 +66,6 @@ margin: auto; } .scroll-container { - display: contents; height: 40vh; max-height: 390px; overflow-y: scroll; -- GitLab From 1c1d6d323817eb9212ecbc2ede28a2d5ad80e917 Mon Sep 17 00:00:00 2001 From: Bastien Dumont <bdumont@grandlyon.com> Date: Thu, 20 Apr 2023 11:37:52 +0200 Subject: [PATCH 26/47] feat(progress): animate width --- .../global-components/progress-bar/progress-bar.component.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/form/form-view/global-components/progress-bar/progress-bar.component.scss b/src/app/form/form-view/global-components/progress-bar/progress-bar.component.scss index e1fe20a4b..f5772ce22 100644 --- a/src/app/form/form-view/global-components/progress-bar/progress-bar.component.scss +++ b/src/app/form/form-view/global-components/progress-bar/progress-bar.component.scss @@ -36,6 +36,7 @@ &::-webkit-progress-value { background-color: $primary-color; border-radius: 12px; + transition: width 0.5s; } &::-moz-progress-bar { background-color: $primary-color; -- GitLab From 62e769f5e4520a8f53789d0604c765857b86a6a2 Mon Sep 17 00:00:00 2001 From: Marlene Simondant <msimondant@grandlyon.com> Date: Thu, 20 Apr 2023 13:58:58 +0200 Subject: [PATCH 27/47] fix(carto): fix display on multiple filters drop down menus --- .../components/more-filters/more-filters.component.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/structure-list/components/more-filters/more-filters.component.scss b/src/app/structure-list/components/more-filters/more-filters.component.scss index e2fa32079..1a5078884 100644 --- a/src/app/structure-list/components/more-filters/more-filters.component.scss +++ b/src/app/structure-list/components/more-filters/more-filters.component.scss @@ -40,6 +40,9 @@ left: 52%; } } +.maxModal { + overflow: hidden; +} .categoryCheckBox { ul { @@ -74,7 +77,6 @@ max-width: 360px; background: white; border-radius: 8px 8px 0 0; - overflow: hidden; } .moreFilters { margin-bottom: 0; -- GitLab From b841f175d66217096e87a1d0bfc0121422f89706 Mon Sep 17 00:00:00 2001 From: Marlene Simondant <msimondant@grandlyon.com> Date: Thu, 20 Apr 2023 15:11:34 +0200 Subject: [PATCH 28/47] fix(carto): retour QA issue 284 bug carto filters --- .../components/more-filters/more-filters.component.scss | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/app/structure-list/components/more-filters/more-filters.component.scss b/src/app/structure-list/components/more-filters/more-filters.component.scss index 1a5078884..24ce1fe4d 100644 --- a/src/app/structure-list/components/more-filters/more-filters.component.scss +++ b/src/app/structure-list/components/more-filters/more-filters.component.scss @@ -7,6 +7,9 @@ @import '../../../../assets/scss/z-index'; @import '../../../../assets/scss/search'; +.modal { + max-width: 380px; +} .modalaccompaniment { left: 220px; @media #{$large-desktop} { @@ -40,9 +43,6 @@ left: 52%; } } -.maxModal { - overflow: hidden; -} .categoryCheckBox { ul { @@ -77,6 +77,7 @@ max-width: 360px; background: white; border-radius: 8px 8px 0 0; + overflow: hidden; } .moreFilters { margin-bottom: 0; -- GitLab From 32f6aa1417e262b7d69d8b9c874fbadcdb2fba5a Mon Sep 17 00:00:00 2001 From: Etienne LOUPIAS <eloupias@grandlyon.com> Date: Thu, 20 Apr 2023 13:46:57 +0000 Subject: [PATCH 29/47] fix(carto): loader not displayed --- src/app/carto/carto.component.html | 2 +- src/app/carto/carto.component.ts | 15 ++++---- .../structure-list.component.html | 34 ++++++++++--------- .../structure-list.component.scss | 2 +- .../structure-list.component.ts | 4 +-- 5 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/app/carto/carto.component.html b/src/app/carto/carto.component.html index d8c4b0bb7..e492b6e06 100644 --- a/src/app/carto/carto.component.html +++ b/src/app/carto/carto.component.html @@ -7,6 +7,7 @@ class="left-pane" fxLayout="column" [structureList]="structures" + [isLoading]="isLoadingStructures" [selectedStructureList]="structuresSelected" [isOrientation]="isOrientationForm" [location]="currentLocation" @@ -14,7 +15,6 @@ [ngClass]="{ mapPhone: isMapPhone === true }" (displayMapMarkerId)="setMapMarkerId($event)" (selectedMarkerId)="setSelectedMarkerId($event)" - (updatedStructure)="updateStructures($event)" (structureSelected)="selectStructure($event)" /> <div class="btnSwitch"> diff --git a/src/app/carto/carto.component.ts b/src/app/carto/carto.component.ts index dc992f620..0571ea605 100644 --- a/src/app/carto/carto.component.ts +++ b/src/app/carto/carto.component.ts @@ -26,6 +26,7 @@ export class CartoComponent implements OnInit { @Output() structureSelection = new EventEmitter<any>(); public structures: Structure[] = []; + public isLoadingStructures: boolean = true; public currentLocation: GeoJson; public displayMarkerId: string; public selectedMarkerId: string; @@ -67,6 +68,7 @@ export class CartoComponent implements OnInit { } public getStructures(filters: Filter[]): void { + this.isLoadingStructures = true; const queryString = _.find(filters, { name: 'query' }); if (queryString) { this.searchedValue = queryString.value; @@ -78,14 +80,16 @@ export class CartoComponent implements OnInit { this.currentLocation.geometry.getLon(), this.currentLocation.geometry.getLat() ); + this.isLoadingStructures = false; }); } else { this.structureService.getStructures(filters).subscribe((structures) => { if (structures) { this.updateStructuresDistance(structures, this.userLongitude, this.userLatitude, false); } else { - this.structures = null; + this.structures = []; } + this.isLoadingStructures = false; }); } } else { @@ -94,18 +98,13 @@ export class CartoComponent implements OnInit { if (structures) { this.updateStructuresDistance(structures, this.userLongitude, this.userLatitude); } else { - this.structures = null; + this.structures = []; } + this.isLoadingStructures = false; }); } } - public updateStructures(s: Structure): void { - this.structures = this.structures.map((structure) => { - return structure._id === s._id ? s : structure; - }); - } - /** * Update structure distance according to user actual position. * @param structures structures data to update diff --git a/src/app/structure-list/structure-list.component.html b/src/app/structure-list/structure-list.component.html index a5c95f9a3..0824ffde4 100644 --- a/src/app/structure-list/structure-list.component.html +++ b/src/app/structure-list/structure-list.component.html @@ -22,22 +22,24 @@ </div> <div id="listCard" class="listCard" role="list" (mouseleave)="mouseLeave()"> - <app-card - *ngFor="let structure of structureList" - class="structure-card" - role="listitem" - [structure]="structure" - [isOrientation]="isOrientation" - [isSelected]="isInPrintList(structure._id)" - (showDetails)="showDetails(structure)" - (keyup.enter)="showDetails(structure)" - (hover)="handleCardHover($event)" - (addToList)="addToList($event)" - /> - <p *ngIf="structureList && structureList.length <= 0 && !isLoading"> - Il n'y a aucune réponse correspondant à votre recherche - </p> - <div *ngIf="structureList && structureList.length <= 0 && isLoading" class="loader"> + <ng-container *ngIf="!isLoading"> + <app-card + *ngFor="let structure of structureList" + class="structure-card" + role="listitem" + [structure]="structure" + [isOrientation]="isOrientation" + [isSelected]="isInPrintList(structure._id)" + (showDetails)="showDetails(structure)" + (keyup.enter)="showDetails(structure)" + (hover)="handleCardHover($event)" + (addToList)="addToList($event)" + /> + <p *ngIf="structureList.length === 0" class="noStructureFound"> + Il n'y a aucune réponse correspondant à votre recherche + </p> + </ng-container> + <div *ngIf="isLoading" class="loader"> <img class="loader-gif" src="/assets/gif/loader_circle.gif" alt /> </div> </div> diff --git a/src/app/structure-list/structure-list.component.scss b/src/app/structure-list/structure-list.component.scss index b08856b47..a3a525ef5 100644 --- a/src/app/structure-list/structure-list.component.scss +++ b/src/app/structure-list/structure-list.component.scss @@ -21,7 +21,7 @@ } } -.listCard > p { +.noStructureFound { margin-left: 1rem; } diff --git a/src/app/structure-list/structure-list.component.ts b/src/app/structure-list/structure-list.component.ts index 26287a5cc..49569c049 100644 --- a/src/app/structure-list/structure-list.component.ts +++ b/src/app/structure-list/structure-list.component.ts @@ -15,18 +15,17 @@ import { PrintService } from '../shared/service/print.service'; export class StructureListComponent implements OnChanges, OnInit { @Input() public isOrientation: boolean = false; @Input() public structureList: Structure[]; + @Input() public isLoading = true; @Input() public location: GeoJson; @Input() public selectedStructure: Structure = new Structure(); @Input() public selectedStructureList: Structure[] = []; @Output() public displayMapMarkerId: EventEmitter<string> = new EventEmitter<string>(); @Output() public selectedMarkerId: EventEmitter<string> = new EventEmitter<string>(); - @Output() public updatedStructure: EventEmitter<Structure> = new EventEmitter<Structure>(); @Output() public structureSelected: EventEmitter<Structure[]> = new EventEmitter<Structure[]>(); public buttonTypeEnum = ButtonType; public structure: Structure; public printMode = false; - public isLoading = true; constructor( private route: ActivatedRoute, @@ -60,7 +59,6 @@ export class StructureListComponent implements OnChanges, OnInit { } if (changes.structureList) { document.getElementById('listCard').scrollTo(0, 0); - this.isLoading = changes.structureList.firstChange; } } -- GitLab From acc22a6ea2c4cbb84c74f90cc04490482334740b Mon Sep 17 00:00:00 2001 From: Marlene Simondant <msimondant@grandlyon.com> Date: Tue, 25 Apr 2023 10:13:40 +0200 Subject: [PATCH 30/47] fix(pages & posts): retour QA, fix width with some ghost elements --- src/app/page/page.component.html | 2 +- .../post/components/post-details/post-details.component.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/page/page.component.html b/src/app/page/page.component.html index 8d2b61059..3809b5440 100644 --- a/src/app/page/page.component.html +++ b/src/app/page/page.component.html @@ -8,7 +8,7 @@ <div *ngIf="page.feature_image" fxLayout="row" class="article-image"> <img class="image" alt="image about the news" [src]="page.feature_image" /> </div> - <div fxLayout="row" class="description"> + <div class="description"> <div [innerHtml]="page.safeHtml"></div> </div> <p *ngIf="version" class="version" fxLayoutAlign="center center">Version : {{ version }}</p> diff --git a/src/app/post/components/post-details/post-details.component.html b/src/app/post/components/post-details/post-details.component.html index 97e12dabe..0f1aca9ff 100644 --- a/src/app/post/components/post-details/post-details.component.html +++ b/src/app/post/components/post-details/post-details.component.html @@ -25,7 +25,7 @@ </div> </div> </div> - <div fxLayout="row" class="description"> + <div class="description"> <div [innerHtml]="post.safeHtml"></div> </div> </div> -- GitLab From 5c655afb8060ca8719d52285cf3207f861497dd8 Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Wed, 26 Apr 2023 07:09:36 +0000 Subject: [PATCH 31/47] fix: update old buttons --- src/app/contact/contact.component.html | 234 +++++++++--------- src/app/contact/contact.component.scss | 14 +- src/app/contact/contact.component.ts | 2 + src/app/header/header.component.html | 11 +- .../newsletter-subscription.component.html | 13 +- .../newsletter-subscription.component.ts | 2 + .../post-list/post-list.component.html | 4 +- .../post-list/post-list.component.scss | 2 +- .../post-list/post-list.component.ts | 8 +- .../components/button/button.component.html | 75 ++++-- .../components/button/button.component.scss | 10 + .../components/button/button.component.ts | 1 + 12 files changed, 222 insertions(+), 154 deletions(-) diff --git a/src/app/contact/contact.component.html b/src/app/contact/contact.component.html index c1d84d502..235e377fb 100644 --- a/src/app/contact/contact.component.html +++ b/src/app/contact/contact.component.html @@ -1,125 +1,123 @@ -<div fxLayout="column" class="form content-container full-screen"> - <div class="section-container"> - <div class="contactForm"> - <form [formGroup]="contactForm" (ngSubmit)="onSubmit()"> - <div class="form-fields"> - <h2>Nous contacter</h2> - <div class="form-group"> - <label for="name">Prénom et Nom</label> - <div fxLayout="row" fxLayoutGap="15px"> - <input type="text" autocomplete="on" formControlName="name" class="form-input" /> - <app-svg-icon - *ngIf="contactForm.get('name').valid" - [iconClass]="'validation'" - [type]="'form'" - [icon]="'validate'" - /> - <app-svg-icon - *ngIf="contactForm.get('name').value && !contactForm.get('name').valid" - [iconClass]="'validation'" - [type]="'form'" - [icon]="'notValidate'" - /> - </div> - </div> - - <div class="form-group"> - <label for="email">Adresse mail</label> - <div fxLayout="row" fxLayoutGap="15px"> - <input type="text" autocomplete="on" formControlName="email" class="form-input" /> - <app-svg-icon - *ngIf="contactForm.get('email').valid" - [iconClass]="'validation'" - [type]="'form'" - [icon]="'validate'" - /> - <app-svg-icon - *ngIf="contactForm.get('email').value && !contactForm.get('email').valid" - [iconClass]="'validation'" - [type]="'form'" - [icon]="'notValidate'" - /> - </div> - </div> +<div class="section-container"> + <form [formGroup]="contactForm" (ngSubmit)="onSubmit()"> + <div class="formFields"> + <h2>Nous contacter</h2> + <div class="form-group"> + <label for="name">Prénom et Nom</label> + <div fxLayout="row" fxLayoutGap="15px"> + <input type="text" autocomplete="on" formControlName="name" class="form-input" /> + <app-svg-icon + *ngIf="contactForm.get('name').valid" + [iconClass]="'validation'" + [type]="'form'" + [icon]="'validate'" + /> + <app-svg-icon + *ngIf="contactForm.get('name').value && !contactForm.get('name').valid" + [iconClass]="'validation'" + [type]="'form'" + [icon]="'notValidate'" + /> + </div> + </div> - <div class="form-group"> - <label for="phone">N° de téléphone</label> - <p class="notRequired">facultatif</p> - <div fxLayout="row" fxLayoutGap="15px"> - <input - type="text" - autocomplete="on" - formControlName="phone" - class="form-input phone" - (input)="utils.modifyPhoneInput(contactForm, 'phone', $event.target)" - /> - <app-svg-icon - *ngIf="contactForm.get('phone').value && contactForm.get('phone').valid" - [iconClass]="'validation'" - [type]="'form'" - [icon]="'validate'" - /> - <app-svg-icon - *ngIf="contactForm.get('phone').value && !contactForm.get('phone').valid" - [iconClass]="'validation'" - [type]="'form'" - [icon]="'notValidate'" - /> - </div> - </div> + <div class="form-group"> + <label for="email">Adresse mail</label> + <div fxLayout="row" fxLayoutGap="15px"> + <input type="text" autocomplete="on" formControlName="email" class="form-input" /> + <app-svg-icon + *ngIf="contactForm.get('email').valid" + [iconClass]="'validation'" + [type]="'form'" + [icon]="'validate'" + /> + <app-svg-icon + *ngIf="contactForm.get('email').value && !contactForm.get('email').valid" + [iconClass]="'validation'" + [type]="'form'" + [icon]="'notValidate'" + /> + </div> + </div> - <div class="form-group"> - <label for="subject">Objet du message</label> - <div fxLayout="row" fxLayoutGap="15px"> - <input type="text" maxlength="100" formControlName="subject" class="form-input subject" /> - <app-svg-icon - *ngIf="contactForm.get('subject').valid" - [iconClass]="'validation'" - [type]="'form'" - [icon]="'validate'" - /> - <app-svg-icon - *ngIf="contactForm.get('subject').value && !contactForm.get('subject').valid" - [iconClass]="'validation'" - [type]="'form'" - [icon]="'notValidate'" - /> - </div> - </div> + <div class="form-group"> + <label for="phone">N° de téléphone</label> + <p class="notRequired">facultatif</p> + <div fxLayout="row" fxLayoutGap="15px"> + <input + type="text" + autocomplete="on" + formControlName="phone" + class="form-input phone" + (input)="utils.modifyPhoneInput(contactForm, 'phone', $event.target)" + /> + <app-svg-icon + *ngIf="contactForm.get('phone').value && contactForm.get('phone').valid" + [iconClass]="'validation'" + [type]="'form'" + [icon]="'validate'" + /> + <app-svg-icon + *ngIf="contactForm.get('phone').value && !contactForm.get('phone').valid" + [iconClass]="'validation'" + [type]="'form'" + [icon]="'notValidate'" + /> + </div> + </div> - <div class="form-group" fx-layout="column"> - <label for="message">Message</label> - <div class="textareaBlock" fxLayout="row" fxLayoutGap="15px"> - <textarea - rows="8" - placeholder="Exemple : J'aimerais avoir de l'aide sur Rés'in." - maxlength="500" - formControlName="message" - ></textarea> - <app-svg-icon - *ngIf="contactForm.get('message').valid" - [iconClass]="'validation'" - [type]="'form'" - [icon]="'validate'" - /> - <app-svg-icon - *ngIf="contactForm.get('message').value && !contactForm.get('message').valid" - [iconClass]="'validation'" - [type]="'form'" - [icon]="'notValidate'" - /> - </div> - <p>{{ contactForm.get('message').value ? contactForm.get('message').value.length : 0 }}/500</p> - </div> + <div class="form-group"> + <label for="subject">Objet du message</label> + <div fxLayout="row" fxLayoutGap="15px"> + <input type="text" maxlength="100" formControlName="subject" class="form-input subject" /> + <app-svg-icon + *ngIf="contactForm.get('subject').valid" + [iconClass]="'validation'" + [type]="'form'" + [icon]="'validate'" + /> + <app-svg-icon + *ngIf="contactForm.get('subject').value && !contactForm.get('subject').valid" + [iconClass]="'validation'" + [type]="'form'" + [icon]="'notValidate'" + /> </div> - <div class="button" fxLayout="row" fxLayoutAlign="center center"> - <a routerLink="../home" class="btn btn-link">Annuler</a> - <button type="submit" class="btn btn-primary" [ngClass]="{ invalid: !contactForm.valid || loading }"> - <span *ngIf="loading" class="spinner-border spinner-border-sm mr-1"></span> - Envoyer - </button> + </div> + + <div class="form-group" fx-layout="column"> + <label for="message">Message</label> + <div class="textareaBlock" fxLayout="row" fxLayoutGap="15px"> + <textarea + rows="8" + placeholder="Exemple : J'aimerais avoir de l'aide sur Rés'in." + maxlength="500" + formControlName="message" + ></textarea> + <app-svg-icon + *ngIf="contactForm.get('message').valid" + [iconClass]="'validation'" + [type]="'form'" + [icon]="'validate'" + /> + <app-svg-icon + *ngIf="contactForm.get('message').value && !contactForm.get('message').valid" + [iconClass]="'validation'" + [type]="'form'" + [icon]="'notValidate'" + /> </div> - </form> + <p>{{ contactForm.get('message').value ? contactForm.get('message').value.length : 0 }}/500</p> + </div> + </div> + <div class="buttons"> + <app-button [style]="buttonTypeEnum.Secondary" [text]="'Annuler'" [routerLink]="'/home'" /> + <app-button + [type]="'submit'" + [style]="buttonTypeEnum.Primary" + [text]="'Envoyer'" + [disabled]="!contactForm.valid || loading" + /> </div> - </div> + </form> </div> diff --git a/src/app/contact/contact.component.scss b/src/app/contact/contact.component.scss index 0755cc8a3..15efcfd8a 100644 --- a/src/app/contact/contact.component.scss +++ b/src/app/contact/contact.component.scss @@ -5,10 +5,12 @@ @import '../../assets/scss/shapes'; @import '../../assets/scss/z-index'; -.form-fields { +.formFields { max-width: 960px; - padding: 20px; + padding: 40px; background: $white; + border-radius: 8px; + border: 1px solid $grey-6; } .phone { width: 200px; @@ -30,10 +32,12 @@ } } } -.button { +.buttons { + display: flex; + justify-content: center; max-width: 960px; - padding: 35px; - gap: 18px; + padding-top: 1rem; + gap: 1rem; } p { text-align: right; diff --git a/src/app/contact/contact.component.ts b/src/app/contact/contact.component.ts index fbb0685c9..e01addf29 100644 --- a/src/app/contact/contact.component.ts +++ b/src/app/contact/contact.component.ts @@ -6,6 +6,7 @@ import { ContactMessage } from '../models/contact-message.model'; import { AuthService } from '../services/auth.service'; import { ContactService } from '../services/contact.service'; import { NotificationService } from '../services/notification.service'; +import { ButtonType } from '../shared/components/button/buttonType.enum'; import { CustomRegExp } from '../utils/CustomRegExp'; import { Utils } from '../utils/utils'; @@ -17,6 +18,7 @@ import { Utils } from '../utils/utils'; export class ContactComponent implements OnInit { public contactForm: UntypedFormGroup; public loading = false; + public buttonTypeEnum = ButtonType; constructor( private formBuilder: UntypedFormBuilder, diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html index d5c43742a..f5c2c8d99 100644 --- a/src/app/header/header.component.html +++ b/src/app/header/header.component.html @@ -37,13 +37,18 @@ <a routerLink="/orientation" [routerLinkActive]="'active'" i18n>Orienter un bénéficiaire</a> <a routerLink="/annuaire" [routerLinkActive]="'active'" i18n>Annuaire</a> <a *ngIf="isAdmin" routerLink="/admin" [routerLinkActive]="'active'">Administration</a> - <button *ngIf="isLoggedIn" type="button" class="red" (click)="openProfileMenu()"> - {{ displayName }} - </button> + <app-button + *ngIf="isLoggedIn" + [text]="displayName" + [style]="buttonTypeEnum.modalPrimary" + [variant]="'small'" + (action)="openProfileMenu()" + /> <app-button *ngIf="!isLoggedIn" [text]="'Se connecter'" [style]="buttonTypeEnum.Secondary" + [variant]="'small'" (action)="goToLoginPage()" /> </div> diff --git a/src/app/newsletter-subscription/newsletter-subscription.component.html b/src/app/newsletter-subscription/newsletter-subscription.component.html index 324741e07..69a3dfdcb 100644 --- a/src/app/newsletter-subscription/newsletter-subscription.component.html +++ b/src/app/newsletter-subscription/newsletter-subscription.component.html @@ -21,12 +21,13 @@ </div> </div> <div class="button" fxLayout="row" fxLayoutAlign="space-around center"> - <a routerLink="../home" class="btn btn-link">Annuler</a> - <button type="submit" class="btn btn-primary" [disabled]="loading"> - <span *ngIf="loading" class="spinner-border spinner-border-sm mr-1"></span> - <div *ngIf="subscriptionMod">S'inscrire</div> - <div *ngIf="!subscriptionMod">Se désinscrire</div> - </button> + <app-button [style]="buttonTypeEnum.Secondary" [text]="'Annuler'" [routerLink]="'/home'" /> + <app-button + [type]="'submit'" + [style]="buttonTypeEnum.Primary" + [text]="subscriptionMod ? 'S\'inscrire' : 'Se désinscrire'" + [disabled]="loading" + /> </div> </form> </div> diff --git a/src/app/newsletter-subscription/newsletter-subscription.component.ts b/src/app/newsletter-subscription/newsletter-subscription.component.ts index c89ec377a..3a2b4c566 100644 --- a/src/app/newsletter-subscription/newsletter-subscription.component.ts +++ b/src/app/newsletter-subscription/newsletter-subscription.component.ts @@ -4,6 +4,7 @@ import { Router } from '@angular/router'; import { lastValueFrom } from 'rxjs'; import { NewsletterService } from '../services/newsletter.service'; import { NotificationService } from '../services/notification.service'; +import { ButtonType } from '../shared/components/button/buttonType.enum'; import { CustomRegExp } from '../utils/CustomRegExp'; @Component({ @@ -16,6 +17,7 @@ export class NewsletterSubscriptionComponent implements OnInit { public loading = false; public submitted = false; public subscriptionMod: boolean; + public buttonTypeEnum = ButtonType; constructor( private formBuilder: UntypedFormBuilder, diff --git a/src/app/post/components/post-list/post-list.component.html b/src/app/post/components/post-list/post-list.component.html index bff70785a..3b3067bcd 100644 --- a/src/app/post/components/post-list/post-list.component.html +++ b/src/app/post/components/post-list/post-list.component.html @@ -28,9 +28,7 @@ <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt /> </div> <div *ngIf="!isLastPage && !isLoading" fxLayout="row" fxLayoutAlign="center center"> - <button type="button" class="btn-primary small" (click)="loadMore()"> - <div class="rowBtn" fxLayout="row" fxLayoutAlign="center center">Voir plus</div> - </button> + <app-button class="loadMore" [text]="'Voir plus'" [style]="buttonTypeEnum.Primary" (click)="loadMore()" /> </div> </div> </div> diff --git a/src/app/post/components/post-list/post-list.component.scss b/src/app/post/components/post-list/post-list.component.scss index 5b5237822..f84f541f1 100644 --- a/src/app/post/components/post-list/post-list.component.scss +++ b/src/app/post/components/post-list/post-list.component.scss @@ -192,6 +192,6 @@ h2 { margin-bottom: 0; } } -.btn-primary { +.loadMore { margin-bottom: 20px; } diff --git a/src/app/post/components/post-list/post-list.component.ts b/src/app/post/components/post-list/post-list.component.ts index c33a0988b..100f46976 100644 --- a/src/app/post/components/post-list/post-list.component.ts +++ b/src/app/post/components/post-list/post-list.component.ts @@ -1,12 +1,13 @@ import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import * as _ from 'lodash'; +import { ButtonType } from '../../../shared/components/button/buttonType.enum'; import { TagEnum } from '../../enum/tag.enum'; import { Pagination } from '../../models/pagination.model'; import { Post } from '../../models/post.model'; -import { Tag } from '../../models/tag.model'; import { PostWithMeta } from '../../models/postWithMeta.model'; +import { Tag } from '../../models/tag.model'; import { PostService } from '../../services/post.service'; -import { ActivatedRoute, Router } from '@angular/router'; -import * as _ from 'lodash'; import { parseSlugToTag } from '../utils/NewsUtils'; @Component({ @@ -24,6 +25,7 @@ export class PostListComponent implements OnInit { public isLoading = false; public isPublishMode = false; public isLastPage: boolean; + public buttonTypeEnum = ButtonType; constructor(private postService: PostService, private route: ActivatedRoute, private router: Router) {} diff --git a/src/app/shared/components/button/button.component.html b/src/app/shared/components/button/button.component.html index f6e100e1e..cc6ffbd70 100644 --- a/src/app/shared/components/button/button.component.html +++ b/src/app/shared/components/button/button.component.html @@ -6,6 +6,7 @@ fxLayout="row center" class="text withIcon left" fxLayoutAlign="space-around center" + [ngClass]="variant" > <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> <span>{{ text }}</span> @@ -15,6 +16,7 @@ fxLayout="row center" class="text withIcon right" fxLayoutAlign="space-around center" + [ngClass]="variant" > <span>{{ text }}</span> <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> @@ -44,6 +46,7 @@ fxLayout="row center" class="text withIcon left" fxLayoutAlign="space-around center" + [ngClass]="variant" > <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> <span [ngClass]="extraClass">{{ text }}</span> @@ -53,6 +56,7 @@ fxLayout="row center" class="text withIcon right" fxLayoutAlign="space-around center" + [ngClass]="variant" > <span [ngClass]="extraClass">{{ text }}</span> <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> @@ -62,12 +66,24 @@ <ng-container *ngIf="style === buttonTypeEnum.modalPrimary"> <button class="btn-regular modal-primary" type="{{ type }}" [disabled]="disabled" (click)="doAction()"> - <div *ngIf="!iconBtn" class="text">{{ text }}</div> - <div *ngIf="iconBtn && iconPos === 'left'" fxLayout="row center" class="text" fxLayoutAlign="space-around center"> + <div *ngIf="!iconBtn" class="text" [ngClass]="variant">{{ text }}</div> + <div + *ngIf="iconBtn && iconPos === 'left'" + fxLayout="row center" + class="text" + fxLayoutAlign="space-around center" + [ngClass]="variant" + > <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> <span>{{ text }}</span> </div> - <div *ngIf="iconBtn && iconPos === 'right'" fxLayout="row center" class="text" fxLayoutAlign="space-around center"> + <div + *ngIf="iconBtn && iconPos === 'right'" + fxLayout="row center" + class="text" + fxLayoutAlign="space-around center" + [ngClass]="variant" + > <span>{{ text }}</span> <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> </div> @@ -82,12 +98,24 @@ [ngClass]="{ disabled: disabled }" (click)="doAction()" > - <div *ngIf="!iconBtn" class="text">{{ text }}</div> - <div *ngIf="iconBtn && iconPos === 'left'" fxLayout="row center" class="text" fxLayoutAlign="space-around center"> + <div *ngIf="!iconBtn" class="text" [ngClass]="variant">{{ text }}</div> + <div + *ngIf="iconBtn && iconPos === 'left'" + fxLayout="row center" + class="text" + fxLayoutAlign="space-around center" + [ngClass]="variant" + > <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> <span>{{ text }}</span> </div> - <div *ngIf="iconBtn && iconPos === 'right'" fxLayout="row center" class="text" fxLayoutAlign="space-around center"> + <div + *ngIf="iconBtn && iconPos === 'right'" + fxLayout="row center" + class="text" + fxLayoutAlign="space-around center" + [ngClass]="variant" + > <span>{{ text }}</span> <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> </div> @@ -104,12 +132,13 @@ [disabled]="disabled" (click)="doAction()" > - <div *ngIf="!iconBtn" class="text" [ngClass]="extraClass">{{ text }}</div> + <div *ngIf="!iconBtn" class="text" [ngClass]="[variant, extraClass || '']">{{ text }}</div> <div *ngIf="iconBtn && iconPos === 'left'" fxLayout="row center" - class="text withIcon left" fxLayoutAlign="space-around center" + class="text withIcon left" + [ngClass]="variant" > <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> <span>{{ text }}</span> @@ -119,6 +148,7 @@ fxLayout="row center" class="text withIcon right" fxLayoutAlign="space-around center" + [ngClass]="variant" > <span>{{ text }}</span> <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> @@ -128,7 +158,7 @@ <ng-container *ngIf="style === buttonTypeEnum.SecondaryUltraWide"> <button class="btn-regular secondary ultrawide" type="{{ type }}" [disabled]="disabled" (click)="doAction()"> - <div *ngIf="!iconBtn" class="text" [ngClass]="extraClass">{{ text }}</div> + <div *ngIf="!iconBtn" class="text" [ngClass]="[variant, extraClass || '']">{{ text }}</div> <div *ngIf="iconBtn && iconPos === 'left'" fxLayout="row center" @@ -143,6 +173,7 @@ fxLayout="row center" class="text withIcon right" fxLayoutAlign="center center" + [ngClass]="variant" > <span>{{ text }}</span> <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> @@ -152,7 +183,13 @@ <ng-container *ngIf="style === buttonTypeEnum.SecondaryOnlyIcon"> <button class="btn-regular secondary" type="{{ type }}" [disabled]="disabled" (click)="doAction()"> - <div *ngIf="iconBtn" fxLayout="row center" class="text withIcon center" fxLayoutAlign="space-around center"> + <div + *ngIf="iconBtn" + fxLayout="row center" + class="text withIcon center" + fxLayoutAlign="space-around center" + [ngClass]="variant" + > <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> </div> </button> @@ -160,8 +197,15 @@ <ng-container *ngIf="style === buttonTypeEnum.ButtonPhone"> <button class="btn-switch-phone" [disabled]="disabled" type="{{ type }}" (click)="doAction()"> - <div *ngIf="!iconBtn" class="text">{{ text }}</div> - <div *ngIf="iconBtn" fxLayout="center" class="text withIcon" fxLayoutAlign="space-around center" fxLayoutGap="13px"> + <div *ngIf="!iconBtn" class="text" [ngClass]="variant">{{ text }}</div> + <div + *ngIf="iconBtn" + fxLayout="center" + class="text withIcon" + fxLayoutAlign="space-around center" + fxLayoutGap="13px" + [ngClass]="variant" + > <app-svg-icon class="iconBtn" [type]="'ico'" @@ -182,7 +226,7 @@ [ngClass]="{ disabled: disabled }" (click)="doAction()" > - <div *ngIf="!iconBtn" class="text">{{ text }}</div> + <div *ngIf="!iconBtn" class="text" [ngClass]="variant">{{ text }}</div> <div *ngIf="iconBtn" fxLayout="row center" @@ -249,7 +293,7 @@ [ngClass]="{ active: active }" (click)="doAction()" > - <div *ngIf="iconBtn" class="text withIcon"> + <div *ngIf="iconBtn" class="text withIcon" [ngClass]="variant"> <app-svg-icon *ngIf="iconBtn" [type]="iconType" @@ -269,12 +313,13 @@ <ng-container *ngIf="style === buttonTypeEnum.RdvsButton"> <button class="btn-rdvs" type="{{ type }}" [disabled]="disabled" [ngClass]="extraClass" (click)="doAction()"> - <div *ngIf="!iconBtn" class="text">{{ text }}</div> + <div *ngIf="!iconBtn" class="text" [ngClass]="variant">{{ text }}</div> <div *ngIf="iconBtn && iconPos === 'left'" fxLayout="row center" class="text withIcon left" fxLayoutAlign="space-around center" + [ngClass]="variant" > <app-svg-icon [type]="iconType" [icon]="iconBtn" [iconColor]="'currentColor'" /> <span [ngClass]="extraClass">{{ text }}</span> diff --git a/src/app/shared/components/button/button.component.scss b/src/app/shared/components/button/button.component.scss index c10c9e4ec..ddf9f5c3f 100644 --- a/src/app/shared/components/button/button.component.scss +++ b/src/app/shared/components/button/button.component.scss @@ -211,6 +211,16 @@ button { border-radius: 4px; font-size: 14px; line-height: 15px; + &.small { + height: 26px; + } + &.medium { + height: 32px; + } + &.large { + height: 37px; + } + &.withIcon { color: $black; height: 36px; diff --git a/src/app/shared/components/button/button.component.ts b/src/app/shared/components/button/button.component.ts index a6127150e..d23441d50 100644 --- a/src/app/shared/components/button/button.component.ts +++ b/src/app/shared/components/button/button.component.ts @@ -10,6 +10,7 @@ export class ButtonComponent { @Input() public style: ButtonType = ButtonType.Regular; @Input() public text: string; @Input() public type = 'button'; + @Input() public variant: 'small' | 'medium' | 'large' = 'medium'; @Input() public iconType = 'ico'; @Input() public iconBtn: string; @Input() public iconPos = 'left'; -- GitLab From 39fd110f9e30abcaac88c416657ead00867162ae Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Wed, 26 Apr 2023 07:17:41 +0000 Subject: [PATCH 32/47] feat(accessibility): improve criteria --- .../deleted-structures.component.html | 2 +- .../manage-lockdown-info.component.html | 2 +- .../admin-structures-list.component.html | 2 +- src/app/annuaire/annuaire.component.html | 1 + .../filter-modal/filter-modal.component.html | 4 ++-- .../result-list/result-list.component.html | 2 +- src/app/app.component.html | 2 +- src/app/carto/carto.component.html | 1 + .../orientation-form-view.component.html | 1 + src/app/header/header.component.html | 18 ++++++++++++------ src/app/header/header.component.ts | 3 +++ .../post-list/post-list.component.html | 2 +- src/app/post/news.component.html | 1 + ...structure-members-management.component.html | 2 +- .../components/button/button.component.html | 2 +- .../structure-list-print.component.html | 2 +- .../more-filters/more-filters.component.html | 14 +++++++------- .../more-filters/more-filters.component.ts | 14 ++++++++------ .../structure-details.component.html | 1 + .../structure-list-search.component.html | 9 +++++++-- .../structure-list.component.html | 2 +- .../structure-join.component.html | 2 +- src/styles.scss | 13 +++++++++++++ 23 files changed, 68 insertions(+), 34 deletions(-) diff --git a/src/app/admin/components/deleted-structures/deleted-structures.component.html b/src/app/admin/components/deleted-structures/deleted-structures.component.html index 636ee8bbf..581e4bef6 100644 --- a/src/app/admin/components/deleted-structures/deleted-structures.component.html +++ b/src/app/admin/components/deleted-structures/deleted-structures.component.html @@ -1,5 +1,5 @@ <app-admin-nav-bar /> -<div *ngIf="isLoading" class="loader"> +<div *ngIf="isLoading" class="loader" aria-busy="true"> <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt /> </div> <div *ngIf="!isLoading" class="adminLayout"> 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 index 8b0f729ac..c0967c8ea 100644 --- a/src/app/admin/components/lockdown-info/manage-lockdown-info.component.html +++ b/src/app/admin/components/lockdown-info/manage-lockdown-info.component.html @@ -1,5 +1,5 @@ <app-admin-nav-bar /> -<div *ngIf="isLoading" class="loader"> +<div *ngIf="isLoading" class="loader" aria-busy="true"> <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt /> </div> <div *ngIf="!isLoading" fxLayout="column" fxLayoutAlign="center center"> diff --git a/src/app/admin/components/structures-list/admin-structures-list.component.html b/src/app/admin/components/structures-list/admin-structures-list.component.html index ea5d3a133..95dc57e44 100644 --- a/src/app/admin/components/structures-list/admin-structures-list.component.html +++ b/src/app/admin/components/structures-list/admin-structures-list.component.html @@ -1,5 +1,5 @@ <app-admin-nav-bar /> -<div *ngIf="isLoading" class="loader"> +<div *ngIf="isLoading" class="loader" aria-busy="true"> <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt /> </div> <div *ngIf="!isLoading" class="adminLayout" fxLayout="column" fxLayoutAlign="center center"> diff --git a/src/app/annuaire/annuaire.component.html b/src/app/annuaire/annuaire.component.html index 1ed2fb070..ba28a1f1d 100644 --- a/src/app/annuaire/annuaire.component.html +++ b/src/app/annuaire/annuaire.component.html @@ -1,4 +1,5 @@ <div class="content-container no-pt" [ngClass]="{ logged: userIsLoggedIn() }"> + <h1 class="visually-hidden">Annuaire</h1> <div *ngIf="userIsLoggedIn()"> <app-search-bar class="hide-on-print" diff --git a/src/app/annuaire/filter-modal/filter-modal.component.html b/src/app/annuaire/filter-modal/filter-modal.component.html index 479a35f68..74a75e189 100644 --- a/src/app/annuaire/filter-modal/filter-modal.component.html +++ b/src/app/annuaire/filter-modal/filter-modal.component.html @@ -9,7 +9,7 @@ fxLayoutAlign="start center" tabindex="0" (click)="toggleCheckbox(filter)" - (keyup.space)="toggleCheckbox(filter)" + (keyup.enter)="toggleCheckbox(filter)" > <label> <input @@ -31,7 +31,7 @@ </div> <div class="footer"> <div class="half-width"> - <app-button tabindex="0" [style]="buttonTypeEnum.modalSecondary" [text]="'Effacer'" (click)="clearFilters()" /> + <app-button [style]="buttonTypeEnum.modalSecondary" [text]="'Effacer'" (click)="clearFilters()" /> </div> <div class="half-width"> <app-button [style]="buttonTypeEnum.modalPrimary" [text]="'Appliquer'" (click)="onSubmitFilters()" /> diff --git a/src/app/annuaire/result-list/result-list.component.html b/src/app/annuaire/result-list/result-list.component.html index 594be3758..109a776a5 100644 --- a/src/app/annuaire/result-list/result-list.component.html +++ b/src/app/annuaire/result-list/result-list.component.html @@ -1,6 +1,6 @@ <ng-container *ngIf="isLoading"> <div class="results"> - <div class="loader"> + <div class="loader" aria-busy="true"> <img class="loader-gif" src="/assets/gif/loader_circle.gif" alt /> </div> </div> diff --git a/src/app/app.component.html b/src/app/app.component.html index bba0323c7..4c6df103e 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,7 +1,7 @@ <div class="app-container"> <app-header /> <div class="app-body"> - <div *ngIf="loading" class="loader"> + <div *ngIf="loading" class="loader" aria-busy="true"> <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt /> </div> <ng-container></ng-container> diff --git a/src/app/carto/carto.component.html b/src/app/carto/carto.component.html index e492b6e06..18994671e 100644 --- a/src/app/carto/carto.component.html +++ b/src/app/carto/carto.component.html @@ -1,4 +1,5 @@ <div class="content-container no-pt" [ngClass]="{ 'height-100': isOrientationForm }"> + <h1 class="visually-hidden">Cartographie</h1> <div class="hide-on-print"> <app-structure-list-search [filters]="filters" (searchEvent)="getStructures($event)" /> </div> diff --git a/src/app/form/orientation-form-view/orientation-form-view.component.html b/src/app/form/orientation-form-view/orientation-form-view.component.html index 66b6fae40..adea40f64 100644 --- a/src/app/form/orientation-form-view/orientation-form-view.component.html +++ b/src/app/form/orientation-form-view/orientation-form-view.component.html @@ -1,4 +1,5 @@ <div class="orientation"> + <h1 class="visually-hidden">Orientation</h1> <app-progress-bar [currentPage]="currentStep" [nbSteps]="nbSteps" /> <div class="container" [ngClass]="{ 'no-max-width': fullScreen }"> <app-needs-selection diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html index f5c2c8d99..120cc5c2f 100644 --- a/src/app/header/header.component.html +++ b/src/app/header/header.component.html @@ -1,4 +1,4 @@ -<div fxLayout="row" class="header hide-on-print"> +<header fxLayout="row" class="header hide-on-print"> <div class="containerIconMenu"> <app-svg-icon class="clickable" @@ -32,10 +32,16 @@ /> </div> <div fxLayout="row" class="right-header" fxLayoutAlign="center center" fxLayoutGap="3vw"> - <a routerLink="/news" [routerLinkActive]="'active'" i18n>Actualités</a> - <a routerLink="/acteurs" [routerLinkActive]="'active'" i18n>Cartographie</a> - <a routerLink="/orientation" [routerLinkActive]="'active'" i18n>Orienter un bénéficiaire</a> - <a routerLink="/annuaire" [routerLinkActive]="'active'" i18n>Annuaire</a> + <a routerLink="/news" [routerLinkActive]="'active'" i18n [attr.aria-current]="isActive('/news')">Actualités</a> + <a routerLink="/acteurs" [routerLinkActive]="'active'" i18n [attr.aria-current]="isActive('/acteurs')"> + Cartographie + </a> + <a routerLink="/orientation" i18n [routerLinkActive]="'active'" [attr.aria-current]="isActive('/orientation')"> + Orienter un bénéficiaire + </a> + <a routerLink="/annuaire" [routerLinkActive]="'active'" i18n [attr.aria-current]="isActive('/annuaire')"> + Annuaire + </a> <a *ngIf="isAdmin" routerLink="/admin" [routerLinkActive]="'active'">Administration</a> <app-button *ngIf="isLoggedIn" @@ -52,7 +58,7 @@ (action)="goToLoginPage()" /> </div> -</div> +</header> <div *ngIf="showMenu" class="mobile-menu" fxLayout="row" [@slideInOut]> <div class="menu-content" fxLayout="column" fxLayoutAlign="space-between"> diff --git a/src/app/header/header.component.ts b/src/app/header/header.component.ts index 8aa9ec347..bcfc5eca5 100644 --- a/src/app/header/header.component.ts +++ b/src/app/header/header.component.ts @@ -49,6 +49,9 @@ export class HeaderComponent { }); } + public isActive(route: string): 'page' | '' { + return this.router.url === route ? 'page' : ''; + } public goToProfile(): void { this.showProfileMenu = false; this.router.navigateByUrl('/profile'); diff --git a/src/app/post/components/post-list/post-list.component.html b/src/app/post/components/post-list/post-list.component.html index 3b3067bcd..ae7f644db 100644 --- a/src/app/post/components/post-list/post-list.component.html +++ b/src/app/post/components/post-list/post-list.component.html @@ -24,7 +24,7 @@ <app-post-card *ngFor="let news of allPosts" class="col" [post]="news" /> </div> </div> - <div *ngIf="isLoading" class="loader"> + <div *ngIf="isLoading" class="loader" aria-busy="true"> <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt /> </div> <div *ngIf="!isLastPage && !isLoading" fxLayout="row" fxLayoutAlign="center center"> diff --git a/src/app/post/news.component.html b/src/app/post/news.component.html index 43b1fd116..c13e087d3 100644 --- a/src/app/post/news.component.html +++ b/src/app/post/news.component.html @@ -1,4 +1,5 @@ <app-post-header /> +<h1 class="visually-hidden">Actualités</h1> <div class="section-container no-padding news"> <router-outlet></router-outlet> </div> diff --git a/src/app/profile/structure-members-management/structure-members-management.component.html b/src/app/profile/structure-members-management/structure-members-management.component.html index 70499f35b..68c160ebf 100644 --- a/src/app/profile/structure-members-management/structure-members-management.component.html +++ b/src/app/profile/structure-members-management/structure-members-management.component.html @@ -22,7 +22,7 @@ /> </div> - <div *ngIf="isLoading" class="loader"> + <div *ngIf="isLoading" class="loader" aria-busy="true"> <img class="loader-gif" src="/assets/gif/loader_circle.gif" alt /> </div> <div *ngIf="structureWithOwners && tempUsers" class="membersList"> diff --git a/src/app/shared/components/button/button.component.html b/src/app/shared/components/button/button.component.html index cc6ffbd70..1856dafa9 100644 --- a/src/app/shared/components/button/button.component.html +++ b/src/app/shared/components/button/button.component.html @@ -25,7 +25,7 @@ </ng-container> <ng-container *ngIf="style === buttonTypeEnum.searchIcon"> - <button class="searchIcon" type="{{ type }}" (click)="doAction()"> + <button class="searchIcon" aria-label="Rechercher" type="{{ type }}" (click)="doAction()"> <div fxLayout="row center" class="searchIcon withIcon" fxLayoutAlign="space-between center"> <app-svg-icon [type]="'ico'" [icon]="iconBtn" [iconColor]="'currentColor'" [iconClass]="'icon-30'" /> </div> diff --git a/src/app/shared/components/structure-list-print/structure-list-print.component.html b/src/app/shared/components/structure-list-print/structure-list-print.component.html index 5d066efaa..abd158620 100644 --- a/src/app/shared/components/structure-list-print/structure-list-print.component.html +++ b/src/app/shared/components/structure-list-print/structure-list-print.component.html @@ -1,7 +1,7 @@ <div *ngFor="let structure of structures" class="multi-print"> <app-structure-detail-print [structure]="structure" /> </div> -<div class="loader"> +<div class="loader" aria-busy="true"> <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt /> <p>Liste en cours d'impression</p> </div> diff --git a/src/app/structure-list/components/more-filters/more-filters.component.html b/src/app/structure-list/components/more-filters/more-filters.component.html index 8ebb36094..12047ca5f 100644 --- a/src/app/structure-list/components/more-filters/more-filters.component.html +++ b/src/app/structure-list/components/more-filters/more-filters.component.html @@ -78,7 +78,12 @@ > <div class="checkbox"> <div class="checkboxItem"> - <label fxLayout="row" fxLayoutAlign="start center"> + <label + fxLayout="row" + fxLayoutAlign="start center" + tabindex="0" + (keyup.enter)="onCheckboxChange($event, c.id, module.name)" + > <input type="checkbox" [checked]="searchService.getIndex(checkedModules, module.id, c.id) > -1" @@ -106,12 +111,7 @@ [ngClass]="{ backDropModalFooter: getModalType() === 'moreFilters' }" > <div class="half-width"> - <app-button - tabindex="0" - [style]="buttonTypeEnum.modalSecondary" - [text]="'Effacer'" - (click)="clearFilters()" - ></app-button> + <app-button [style]="buttonTypeEnum.modalSecondary" [text]="'Effacer'" (click)="clearFilters()"></app-button> </div> <div class="half-width"> <app-button diff --git a/src/app/structure-list/components/more-filters/more-filters.component.ts b/src/app/structure-list/components/more-filters/more-filters.component.ts index 4deb521d4..a3cee6dc0 100644 --- a/src/app/structure-list/components/more-filters/more-filters.component.ts +++ b/src/app/structure-list/components/more-filters/more-filters.component.ts @@ -39,14 +39,16 @@ export class MoreFiltersComponent implements OnInit, OnChanges { } // Management of the checkbox event (Check / Uncheck) - public onCheckboxChange(event, categ: string, text?: string): void { - const checkValue: string = event.target.value; - if (event.target.checked) { - this.checkedModules.push(new Module(checkValue, categ, text ? text : checkValue)); + public onCheckboxChange(event, category: string, text?: string): void { + // Handle mouse or keyboard event + const checkValue: string = event.target.value || event.target?.firstChild?.value; + const checked: boolean = event.target.checked || !event.target?.firstChild?.checked; + if (checked) { + this.checkedModules.push(new Module(checkValue, category, text ? text : checkValue)); } else { // Check if the module is present in the list and remove it - if (this.searchService.getIndex(this.checkedModules, checkValue, categ) > -1) { - this.checkedModules.splice(this.searchService.getIndex(this.checkedModules, checkValue, categ), 1); + if (this.searchService.getIndex(this.checkedModules, checkValue, category) > -1) { + this.checkedModules.splice(this.searchService.getIndex(this.checkedModules, checkValue, category), 1); } } } 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 d919bc05d..1bf6b6a95 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 @@ -13,6 +13,7 @@ class="structure-details-content" fxLayout="row" fxLayoutAlign="center center" + aria-busy="true" > <img class="loader-gif" src="/assets/gif/loader_circle.gif" alt /> </div> diff --git a/src/app/structure-list/components/structure-list-search/structure-list-search.component.html b/src/app/structure-list/components/structure-list-search/structure-list-search.component.html index 79b5005af..09a1ed629 100644 --- a/src/app/structure-list/components/structure-list-search/structure-list-search.component.html +++ b/src/app/structure-list/components/structure-list-search/structure-list-search.component.html @@ -1,7 +1,12 @@ <div class="block"> <div class="content"> <form class="inputSearch" [formGroup]="searchForm" (ngSubmit)="applyFilter(searchForm.value.searchTerm)"> - <input type="text" formControlName="searchTerm" placeholder="Rechercher une association, une commune..." /> + <input + type="text" + formControlName="searchTerm" + placeholder="Rechercher une association, une commune..." + aria-label="Rechercher une structure" + /> <button *ngIf="this.searchForm.get('searchTerm').value?.length > 0" class="icon close" @@ -11,7 +16,7 @@ <div class="ico-close-search"></div> </button> <span *ngIf="this.searchForm.get('searchTerm').value?.length > 0" class="separation"></span> - <app-button [style]="buttonTypeEnum.searchIcon" [iconBtn]="'search'" [type]="'submit'" /> + <app-button alt="Rechercher" [style]="buttonTypeEnum.searchIcon" [iconBtn]="'search'" [type]="'submit'" /> </form> <div class="btnSection" (appClickOutside)="closeModal()"> <button diff --git a/src/app/structure-list/structure-list.component.html b/src/app/structure-list/structure-list.component.html index 0824ffde4..2e2db9d8a 100644 --- a/src/app/structure-list/structure-list.component.html +++ b/src/app/structure-list/structure-list.component.html @@ -39,7 +39,7 @@ Il n'y a aucune réponse correspondant à votre recherche </p> </ng-container> - <div *ngIf="isLoading" class="loader"> + <div *ngIf="isLoading" class="loader" aria-busy="true"> <img class="loader-gif" src="/assets/gif/loader_circle.gif" alt /> </div> </div> diff --git a/src/app/structure/structure-join/structure-join.component.html b/src/app/structure/structure-join/structure-join.component.html index 96ba731b8..83f37e57d 100644 --- a/src/app/structure/structure-join/structure-join.component.html +++ b/src/app/structure/structure-join/structure-join.component.html @@ -14,7 +14,7 @@ </div> </div> </ng-container> - <div *ngIf="isLoading" class="loader"> + <div *ngIf="isLoading" class="loader" aria-busy="true"> <img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt /> </div> <ng-container *ngIf="!structureName && !isLoading && validationToken"> diff --git a/src/styles.scss b/src/styles.scss index cf1de4539..53816bbc9 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -26,6 +26,7 @@ body { height: 100%; margin: 0; padding: 0; + color: $black; background-color: $grey-8; min-height: 100vh; min-height: -webkit-fill-available; @@ -588,3 +589,15 @@ button { :focus-visible { outline-color: $red; } + +.visually-hidden { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} -- GitLab From 53a5cde63e6391538fc7a7da76b9314da71faf8f Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Thu, 27 Apr 2023 09:44:20 +0000 Subject: [PATCH 33/47] fix(annuaire): filters --- .../filter-modal/filter-modal.component.ts | 45 +++++++++---------- .../search-bar/search-bar.component.html | 4 +- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/src/app/annuaire/filter-modal/filter-modal.component.ts b/src/app/annuaire/filter-modal/filter-modal.component.ts index 1e02f64a2..ecf9cb2bc 100644 --- a/src/app/annuaire/filter-modal/filter-modal.component.ts +++ b/src/app/annuaire/filter-modal/filter-modal.component.ts @@ -11,48 +11,37 @@ export class FilterModalComponent implements OnInit, OnChanges { @Input() public modalType: TypeModal; @Input() public filtersTypes: string[]; @Input() public checkedFilters: string[]; - @Output() searchEvent = new EventEmitter(); - @Output() closeEvent = new EventEmitter(); + @Input() public jobFilterChecked: string[]; + @Input() public employerFilterChecked: string[]; + @Output() fetchResults = new EventEmitter<string[]>(); public buttonTypeEnum = ButtonType; public toggledCategories: string[] = []; public currentCheckedFilters: string[] = []; ngOnInit(): void { - this.currentCheckedFilters = [...this.checkedFilters]; + this.currentCheckedFilters = this.checkedFilters.slice(); } ngOnChanges(changes: SimpleChanges): void { - if (changes.modalType) this.currentCheckedFilters = []; + if (changes.modalType) this.currentCheckedFilters = this.checkedFilters.slice(); } public isFilterChecked(filter: string): boolean { - return this.currentCheckedFilters.findIndex((_filter) => _filter === filter) > -1; + return this.currentCheckedFilters.includes(filter); } public toggleCheckbox(filter: string): void { - const filterExists = this.currentCheckedFilters.findIndex((_filterChecked) => _filterChecked === filter) !== -1; + const filterExists = this.currentCheckedFilters.includes(filter); if (!filterExists) { - const index = this.filtersTypes.findIndex((_filter) => _filter === filter); + const index = this.filtersTypes.indexOf(filter); this.currentCheckedFilters.push(this.filtersTypes[index]); } else { - const filterToRemove = this.currentCheckedFilters.findIndex((_filterChecked) => _filterChecked === filter); - this.currentCheckedFilters.splice(filterToRemove); + const filterToRemove = this.currentCheckedFilters.indexOf(filter); + this.currentCheckedFilters.splice(filterToRemove, 1); } } - // Clear only filters in the current modal - public clearFilters(): void { - this.checkedFilters = []; - this.currentCheckedFilters = []; - this.emitModules(this.checkedFilters); - } - - // Sends an array containing all modules - public emitModules(filters: string[]): void { - this.searchEvent.emit(filters); - } - public getModalType(): string { switch (this.modalType) { case TypeModal.employers: @@ -64,12 +53,18 @@ export class FilterModalComponent implements OnInit, OnChanges { } } - public closeModal(): void { - this.closeEvent.emit(); + /** Clear only filters in the current modal */ + public clearFilters(): void { + if (this.modalType === TypeModal.jobs) { + this.currentCheckedFilters = this.employerFilterChecked; + } else if (this.modalType === TypeModal.employers) { + this.currentCheckedFilters = this.jobFilterChecked; + } + + this.fetchResults.emit(this.currentCheckedFilters); } public onSubmitFilters(): void { - this.checkedFilters = this.currentCheckedFilters; - this.emitModules(this.currentCheckedFilters); + this.fetchResults.emit(this.currentCheckedFilters); } } diff --git a/src/app/annuaire/search-bar/search-bar.component.html b/src/app/annuaire/search-bar/search-bar.component.html index 75157e8be..d41980813 100644 --- a/src/app/annuaire/search-bar/search-bar.component.html +++ b/src/app/annuaire/search-bar/search-bar.component.html @@ -57,8 +57,10 @@ <app-filter-modal [modalType]="modalTypeOpened" [checkedFilters]="searchService.checkedFilterList" + [employerFilterChecked]="employerFilterChecked" + [jobFilterChecked]="jobFilterChecked" [filtersTypes]="getModalCategory()" - (searchEvent)="fetchResults($event)" + (fetchResults)="fetchResults($event)" (closeEvent)="closeModal()" /> </div> -- GitLab From c5721444058d065b42df889779b6760019045ec9 Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Thu, 4 May 2023 09:00:11 +0000 Subject: [PATCH 34/47] chore: update scss paths --- angular.json | 3 +++ src/app/admin/admin.scss | 2 +- .../manage-jobs/manage-jobs.component.scss | 2 +- .../manage-users/manage-users.component.scss | 2 +- src/app/annuaire/annuaire.component.scss | 2 +- .../filter-modal/filter-modal.component.scss | 4 ++-- .../result-list/result-list.component.scss | 6 +++--- .../search-bar/search-bar.component.scss | 2 +- src/app/app.component.scss | 6 +++--- src/app/carto/carto.component.scss | 8 ++++---- src/app/contact/contact.component.scss | 12 ++++++------ src/app/footer/footer.component.scss | 8 ++++---- .../footer-form/footer-form.component.scss | 6 +++--- .../account-credentials.component.scss | 4 ++-- .../form/form-view/form-view.component.scss | 8 ++++---- .../information-step.component.scss | 4 ++-- .../progress-bar/progress-bar.component.scss | 8 ++++---- ...personal-offer-accompaniment.component.scss | 2 +- .../profile-employer-selection.component.scss | 8 ++++---- .../profile-job-selection.component.scss | 2 +- .../profile-structure-choice.component.scss | 8 ++++---- .../structure-consent.component.scss | 4 ++-- .../structure-contact.component.scss | 4 ++-- .../structure-equipments.component.scss | 6 +++--- ...cture-web-and-social-network.component.scss | 6 +++--- .../login-modal/login-modal.component.scss | 4 ++-- .../multi-radio-form.component.scss | 6 +++--- .../orientation-recap.component.scss | 6 +++--- .../print-header/print-header.component.scss | 4 ++-- .../structure-orientator.component.scss | 8 ++++---- .../mediation-hours-selection.component.scss | 6 +++--- .../orientation-form-view.component.scss | 8 ++++---- .../orientation-comments.component.scss | 4 ++-- src/app/header/header.component.scss | 16 ++++++++-------- src/app/login/login.component.scss | 8 ++++---- src/app/map/components/map.component.scss | 16 ++++++++-------- .../newsletter-subscription.component.scss | 2 +- src/app/page/page.component.scss | 6 +++--- .../post-card/post-card.component.scss | 6 +++--- .../post-details/post-details.component.scss | 12 ++++++------ .../post-header/post-header.component.scss | 10 +++++----- .../post-list/post-list.component.scss | 8 ++++---- .../post-modal-filters.component.scss | 14 +++++++------- .../post-publish/post-publish.component.scss | 6 +++--- .../post-tag/post-tag.component.scss | 4 ++-- src/app/profile/edit/edit.component.scss | 10 +++++----- .../personal-offer-edition.component.scss | 10 +++++----- .../personal-offer.component.scss | 4 ++-- .../profile-structure-member.component.scss | 8 ++++---- .../profile-structure.component.scss | 8 ++++---- src/app/profile/profile.component.scss | 12 ++++++------ .../structure-add-member-modal.component.scss | 8 ++++---- .../missing-information.component.scss | 2 +- .../no-information.component.scss | 2 +- .../structure-edition-summary.component.scss | 8 ++++---- ...structure-members-management.component.scss | 6 +++--- .../structures-management.component.scss | 6 +++--- .../reset-password.component.scss | 8 ++++---- .../accompaniment-picker.component.scss | 2 +- .../address-autocomplete.component.scss | 2 +- .../components/button/button.component.scss | 8 ++++---- .../checkbox-form/checkbox-form.component.scss | 4 ++-- .../custom-modal/custom-modal.component.scss | 8 ++++---- .../data-share-consent.component.scss | 12 ++++++------ .../hour-picker/hour-picker.component.scss | 6 +++--- .../logo-card/logo-card.component.scss | 4 ++-- .../modal-confirmation.component.scss | 8 ++++---- .../modal-join-confirmation.component.scss | 8 ++++---- .../password-form/password-form.component.scss | 8 ++++---- .../radio-form/radio-form.component.scss | 4 ++-- .../structure-detail-print.component.scss | 12 ++++++------ .../structure-list-print.component.scss | 4 ++-- .../structure-type-picker.component.scss | 8 ++++---- .../svg-icon/svg-icon.component.scss | 2 +- .../text-input-modal.component.scss | 8 ++++---- .../training-type-picker.component.scss | 10 +++++----- .../components/card/card.component.scss | 8 ++++---- .../more-filters/more-filters.component.scss | 16 ++++++++-------- .../structure-details.component.scss | 10 +++++----- .../structure-list-search-print.component.scss | 4 ++-- .../structure-list-search.component.scss | 12 ++++++------ .../structure-list.component.scss | 8 ++++---- .../structure-exclude.component.scss | 4 ++-- .../structure-join.component.scss | 4 ++-- src/assets/scss/_ghost.scss | 8 ++++---- src/styles.scss | 18 +++++++++--------- 86 files changed, 293 insertions(+), 290 deletions(-) diff --git a/angular.json b/angular.json index a4f73808c..a1ce90fb2 100644 --- a/angular.json +++ b/angular.json @@ -52,6 +52,9 @@ } ], "styles": ["src/styles.scss"], + "stylePreprocessorOptions": { + "includePaths": ["src/assets/scss"] + }, "scripts": [], "serviceWorker": true, "ngswConfigPath": "ngsw-config.json", diff --git a/src/app/admin/admin.scss b/src/app/admin/admin.scss index fa2f89dbb..d46c36d05 100644 --- a/src/app/admin/admin.scss +++ b/src/app/admin/admin.scss @@ -1,4 +1,4 @@ -@import '../../assets/scss/color'; +@import 'color'; .adminLayout { display: flex; diff --git a/src/app/admin/components/manage-jobs/manage-jobs.component.scss b/src/app/admin/components/manage-jobs/manage-jobs.component.scss index 31e29570c..61fb9a201 100644 --- a/src/app/admin/components/manage-jobs/manage-jobs.component.scss +++ b/src/app/admin/components/manage-jobs/manage-jobs.component.scss @@ -1,4 +1,4 @@ -@import '../../../../assets/scss/color'; +@import 'color'; .user-table { width: 100%; diff --git a/src/app/admin/components/manage-users/manage-users.component.scss b/src/app/admin/components/manage-users/manage-users.component.scss index b599dea1d..d19123173 100644 --- a/src/app/admin/components/manage-users/manage-users.component.scss +++ b/src/app/admin/components/manage-users/manage-users.component.scss @@ -1,4 +1,4 @@ -@import '../../../../assets/scss/color'; +@import 'color'; .user-table { width: 100%; diff --git a/src/app/annuaire/annuaire.component.scss b/src/app/annuaire/annuaire.component.scss index b56258688..e66c8fb0b 100644 --- a/src/app/annuaire/annuaire.component.scss +++ b/src/app/annuaire/annuaire.component.scss @@ -1,4 +1,4 @@ -@import '../../assets/scss/layout'; +@import 'layout'; .content-container { box-sizing: border-box; diff --git a/src/app/annuaire/filter-modal/filter-modal.component.scss b/src/app/annuaire/filter-modal/filter-modal.component.scss index 78db14733..09aafecea 100644 --- a/src/app/annuaire/filter-modal/filter-modal.component.scss +++ b/src/app/annuaire/filter-modal/filter-modal.component.scss @@ -1,5 +1,5 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/hyperlink'; +@import 'color'; +@import 'hyperlink'; .modalemployers { left: 515px; diff --git a/src/app/annuaire/result-list/result-list.component.scss b/src/app/annuaire/result-list/result-list.component.scss index 50c013396..67ec2440c 100644 --- a/src/app/annuaire/result-list/result-list.component.scss +++ b/src/app/annuaire/result-list/result-list.component.scss @@ -1,6 +1,6 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/layout'; -@import '../../../assets/scss/breakpoint'; +@import 'color'; +@import 'layout'; +@import 'breakpoint'; .results { max-width: 980px; diff --git a/src/app/annuaire/search-bar/search-bar.component.scss b/src/app/annuaire/search-bar/search-bar.component.scss index 43b7a33cb..fd546fb82 100644 --- a/src/app/annuaire/search-bar/search-bar.component.scss +++ b/src/app/annuaire/search-bar/search-bar.component.scss @@ -1,4 +1,4 @@ -@import '../../../assets/scss/search'; +@import 'search'; .block { display: flex; diff --git a/src/app/app.component.scss b/src/app/app.component.scss index ba071c611..071f1c7c4 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -1,6 +1,6 @@ -@import '../assets/scss/breakpoint'; -@import '../assets/scss/color'; -@import '../assets/scss/layout'; +@import 'breakpoint'; +@import 'color'; +@import 'layout'; .app-container { display: block; diff --git a/src/app/carto/carto.component.scss b/src/app/carto/carto.component.scss index 94c04ca29..2f9f9fc3e 100644 --- a/src/app/carto/carto.component.scss +++ b/src/app/carto/carto.component.scss @@ -1,7 +1,7 @@ -@import '../../assets/scss/breakpoint'; -@import '../../assets/scss/layout'; -@import '../../assets/scss/z-index'; -@import '../../assets/scss/color'; +@import 'breakpoint'; +@import 'layout'; +@import 'z-index'; +@import 'color'; ::ng-deep .footer { @media #{$tablet} { diff --git a/src/app/contact/contact.component.scss b/src/app/contact/contact.component.scss index 15efcfd8a..de713d7cc 100644 --- a/src/app/contact/contact.component.scss +++ b/src/app/contact/contact.component.scss @@ -1,9 +1,9 @@ -@import '../../assets/scss/color'; -@import '../../assets/scss/layout'; -@import '../../assets/scss/breakpoint'; -@import '../../assets/scss/typography'; -@import '../../assets/scss/shapes'; -@import '../../assets/scss/z-index'; +@import 'color'; +@import 'layout'; +@import 'breakpoint'; +@import 'typography'; +@import 'shapes'; +@import 'z-index'; .formFields { max-width: 960px; diff --git a/src/app/footer/footer.component.scss b/src/app/footer/footer.component.scss index ebfea84f2..703fd84b1 100644 --- a/src/app/footer/footer.component.scss +++ b/src/app/footer/footer.component.scss @@ -1,7 +1,7 @@ -@import '../../assets/scss/color'; -@import '../../assets/scss/breakpoint'; -@import '../../assets/scss/typography'; -@import '../../assets/scss/layout'; +@import 'color'; +@import 'breakpoint'; +@import 'typography'; +@import 'layout'; :host { margin-top: auto; diff --git a/src/app/form/footer-form/footer-form.component.scss b/src/app/form/footer-form/footer-form.component.scss index 3e80d00de..1969fcedf 100644 --- a/src/app/form/footer-form/footer-form.component.scss +++ b/src/app/form/footer-form/footer-form.component.scss @@ -1,6 +1,6 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/typography'; -@import '../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; .footerForm { display: flex; diff --git a/src/app/form/form-view/account-form/account-credentials/account-credentials.component.scss b/src/app/form/form-view/account-form/account-credentials/account-credentials.component.scss index 26d92dee3..87159e1a7 100644 --- a/src/app/form/form-view/account-form/account-credentials/account-credentials.component.scss +++ b/src/app/form/form-view/account-form/account-credentials/account-credentials.component.scss @@ -1,5 +1,5 @@ -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/typography'; +@import 'color'; +@import 'typography'; .disabled { opacity: 0.4; diff --git a/src/app/form/form-view/form-view.component.scss b/src/app/form/form-view/form-view.component.scss index 33b4865ff..9836ac435 100644 --- a/src/app/form/form-view/form-view.component.scss +++ b/src/app/form/form-view/form-view.component.scss @@ -1,7 +1,7 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/breakpoint'; -@import '../../../assets/scss/layout'; -@import '../../../assets//scss/typography'; +@import 'color'; +@import 'breakpoint'; +@import 'layout'; +@import 'typography'; :host { height: 100%; diff --git a/src/app/form/form-view/global-components/information-step/information-step.component.scss b/src/app/form/form-view/global-components/information-step/information-step.component.scss index c00c408b3..ebb4894a8 100644 --- a/src/app/form/form-view/global-components/information-step/information-step.component.scss +++ b/src/app/form/form-view/global-components/information-step/information-step.component.scss @@ -1,5 +1,5 @@ -@import '../../../../../assets/scss/typography'; -@import '../../../../../assets/scss/color'; +@import 'typography'; +@import 'color'; .information-step-container { display: flex; diff --git a/src/app/form/form-view/global-components/progress-bar/progress-bar.component.scss b/src/app/form/form-view/global-components/progress-bar/progress-bar.component.scss index f5772ce22..bfd1963a4 100644 --- a/src/app/form/form-view/global-components/progress-bar/progress-bar.component.scss +++ b/src/app/form/form-view/global-components/progress-bar/progress-bar.component.scss @@ -1,7 +1,7 @@ -@import '../../../../../assets/scss/layout'; -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/typography'; -@import '../../../../../assets/scss/breakpoint'; +@import 'layout'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; .progressBar { max-width: 980px; diff --git a/src/app/form/form-view/personal-offer-form/personal-offer-accompaniment/personal-offer-accompaniment.component.scss b/src/app/form/form-view/personal-offer-form/personal-offer-accompaniment/personal-offer-accompaniment.component.scss index 335870e68..46e81fc09 100644 --- a/src/app/form/form-view/personal-offer-form/personal-offer-accompaniment/personal-offer-accompaniment.component.scss +++ b/src/app/form/form-view/personal-offer-form/personal-offer-accompaniment/personal-offer-accompaniment.component.scss @@ -1 +1 @@ -@import '../../../../../assets/scss/buttons'; +@import 'buttons'; diff --git a/src/app/form/form-view/profile-form/profile-employer-selection/profile-employer-selection.component.scss b/src/app/form/form-view/profile-form/profile-employer-selection/profile-employer-selection.component.scss index f22d92388..23800a410 100644 --- a/src/app/form/form-view/profile-form/profile-employer-selection/profile-employer-selection.component.scss +++ b/src/app/form/form-view/profile-form/profile-employer-selection/profile-employer-selection.component.scss @@ -1,7 +1,7 @@ -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/typography'; -@import '../../../../../assets/scss/inputs'; -@import '../../../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'inputs'; +@import 'breakpoint'; .search-structure { width: 380px; diff --git a/src/app/form/form-view/profile-form/profile-job-selection/profile-job-selection.component.scss b/src/app/form/form-view/profile-form/profile-job-selection/profile-job-selection.component.scss index 335870e68..46e81fc09 100644 --- a/src/app/form/form-view/profile-form/profile-job-selection/profile-job-selection.component.scss +++ b/src/app/form/form-view/profile-form/profile-job-selection/profile-job-selection.component.scss @@ -1 +1 @@ -@import '../../../../../assets/scss/buttons'; +@import 'buttons'; diff --git a/src/app/form/form-view/profile-form/profile-structure-choice/profile-structure-choice.component.scss b/src/app/form/form-view/profile-form/profile-structure-choice/profile-structure-choice.component.scss index 8f135dc76..b62556940 100644 --- a/src/app/form/form-view/profile-form/profile-structure-choice/profile-structure-choice.component.scss +++ b/src/app/form/form-view/profile-form/profile-structure-choice/profile-structure-choice.component.scss @@ -1,7 +1,7 @@ -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/typography'; -@import '../../../../../assets/scss/inputs'; -@import '../../../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'inputs'; +@import 'breakpoint'; .search-structure { width: 380px; diff --git a/src/app/form/form-view/structure-form/structure-consent/structure-consent.component.scss b/src/app/form/form-view/structure-form/structure-consent/structure-consent.component.scss index 9df02c794..17a340228 100644 --- a/src/app/form/form-view/structure-form/structure-consent/structure-consent.component.scss +++ b/src/app/form/form-view/structure-form/structure-consent/structure-consent.component.scss @@ -1,5 +1,5 @@ -@import '../../../../../assets/scss/typography'; -@import '../../../../../assets/scss/color'; +@import 'typography'; +@import 'color'; h3 { @include lato-bold-18; diff --git a/src/app/form/form-view/structure-form/structure-contact/structure-contact.component.scss b/src/app/form/form-view/structure-form/structure-contact/structure-contact.component.scss index 809c9f217..46ffa6b08 100644 --- a/src/app/form/form-view/structure-form/structure-contact/structure-contact.component.scss +++ b/src/app/form/form-view/structure-form/structure-contact/structure-contact.component.scss @@ -1,5 +1,5 @@ -@import './../../../../../assets/scss/color'; -@import './../../../../../assets/scss/typography'; +@import 'color'; +@import 'typography'; .label-optional { color: $grey-3; diff --git a/src/app/form/form-view/structure-form/structure-equipments/structure-equipments.component.scss b/src/app/form/form-view/structure-form/structure-equipments/structure-equipments.component.scss index 1df7195fb..2a267f8ff 100644 --- a/src/app/form/form-view/structure-form/structure-equipments/structure-equipments.component.scss +++ b/src/app/form/form-view/structure-form/structure-equipments/structure-equipments.component.scss @@ -1,6 +1,6 @@ -@import '../../../../../assets/scss/typography'; -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/breakpoint'; +@import 'typography'; +@import 'color'; +@import 'breakpoint'; //section equipments controller .controller { diff --git a/src/app/form/form-view/structure-form/structure-web-and-social-network/structure-web-and-social-network.component.scss b/src/app/form/form-view/structure-form/structure-web-and-social-network/structure-web-and-social-network.component.scss index 0310b8aac..c142119a8 100644 --- a/src/app/form/form-view/structure-form/structure-web-and-social-network/structure-web-and-social-network.component.scss +++ b/src/app/form/form-view/structure-form/structure-web-and-social-network/structure-web-and-social-network.component.scss @@ -1,6 +1,6 @@ -@import '../../../../../assets/scss/typography'; -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/breakpoint'; +@import 'typography'; +@import 'color'; +@import 'breakpoint'; .collapse { border: 1px solid $grey-5; diff --git a/src/app/form/orientation-form-view/global-components/login-modal/login-modal.component.scss b/src/app/form/orientation-form-view/global-components/login-modal/login-modal.component.scss index 0a4a5eb62..ddb2cac45 100644 --- a/src/app/form/orientation-form-view/global-components/login-modal/login-modal.component.scss +++ b/src/app/form/orientation-form-view/global-components/login-modal/login-modal.component.scss @@ -1,5 +1,5 @@ -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/typography'; +@import 'color'; +@import 'typography'; .modal { max-width: 390px; diff --git a/src/app/form/orientation-form-view/global-components/multi-radio-form/multi-radio-form.component.scss b/src/app/form/orientation-form-view/global-components/multi-radio-form/multi-radio-form.component.scss index 9507fa3a9..59e727739 100644 --- a/src/app/form/orientation-form-view/global-components/multi-radio-form/multi-radio-form.component.scss +++ b/src/app/form/orientation-form-view/global-components/multi-radio-form/multi-radio-form.component.scss @@ -1,6 +1,6 @@ -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/typography'; -@import '../../../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; .radiocard { button { display: flex; diff --git a/src/app/form/orientation-form-view/global-components/orientation-recap/orientation-recap.component.scss b/src/app/form/orientation-form-view/global-components/orientation-recap/orientation-recap.component.scss index f9f5a00ed..1252081e3 100644 --- a/src/app/form/orientation-form-view/global-components/orientation-recap/orientation-recap.component.scss +++ b/src/app/form/orientation-form-view/global-components/orientation-recap/orientation-recap.component.scss @@ -1,6 +1,6 @@ -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/typography'; -@import '../../../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; .container { display: flex; diff --git a/src/app/form/orientation-form-view/global-components/print-header/print-header.component.scss b/src/app/form/orientation-form-view/global-components/print-header/print-header.component.scss index a80630433..81f1b77d9 100644 --- a/src/app/form/orientation-form-view/global-components/print-header/print-header.component.scss +++ b/src/app/form/orientation-form-view/global-components/print-header/print-header.component.scss @@ -1,5 +1,5 @@ -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/typography'; +@import 'color'; +@import 'typography'; .header-infos { display: flex; diff --git a/src/app/form/orientation-form-view/global-components/structure-orientator/structure-orientator.component.scss b/src/app/form/orientation-form-view/global-components/structure-orientator/structure-orientator.component.scss index 57c15c87a..088c84851 100644 --- a/src/app/form/orientation-form-view/global-components/structure-orientator/structure-orientator.component.scss +++ b/src/app/form/orientation-form-view/global-components/structure-orientator/structure-orientator.component.scss @@ -1,7 +1,7 @@ -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/typography'; -@import '../../../../../assets/scss/inputs'; -@import '../../../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'inputs'; +@import 'breakpoint'; .select-structure { width: 380px; diff --git a/src/app/form/orientation-form-view/online-demarch/online-mediation/mediation-hours-selection/mediation-hours-selection.component.scss b/src/app/form/orientation-form-view/online-demarch/online-mediation/mediation-hours-selection/mediation-hours-selection.component.scss index 25425d7e9..f2c6436cb 100644 --- a/src/app/form/orientation-form-view/online-demarch/online-mediation/mediation-hours-selection/mediation-hours-selection.component.scss +++ b/src/app/form/orientation-form-view/online-demarch/online-mediation/mediation-hours-selection/mediation-hours-selection.component.scss @@ -1,6 +1,6 @@ -@import '../../../../../../assets/scss/color'; -@import '../../../../../../assets/scss/breakpoint'; -@import '../../../../../../assets/scss/typography'; +@import 'color'; +@import 'breakpoint'; +@import 'typography'; .subtitle { color: $grey-3; diff --git a/src/app/form/orientation-form-view/orientation-form-view.component.scss b/src/app/form/orientation-form-view/orientation-form-view.component.scss index db879a7d8..34e37f453 100644 --- a/src/app/form/orientation-form-view/orientation-form-view.component.scss +++ b/src/app/form/orientation-form-view/orientation-form-view.component.scss @@ -1,7 +1,7 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/breakpoint'; -@import '../../../assets/scss/layout'; -@import '../../../assets//scss/typography'; +@import 'color'; +@import 'breakpoint'; +@import 'layout'; +@import 'typography'; :host { height: 100%; diff --git a/src/app/form/orientation-form-view/orientation-structure-list/orientation-comments/orientation-comments.component.scss b/src/app/form/orientation-form-view/orientation-structure-list/orientation-comments/orientation-comments.component.scss index 63dc5eaf7..708c472d7 100644 --- a/src/app/form/orientation-form-view/orientation-structure-list/orientation-comments/orientation-comments.component.scss +++ b/src/app/form/orientation-form-view/orientation-structure-list/orientation-comments/orientation-comments.component.scss @@ -1,5 +1,5 @@ -@import '../../../../../assets/scss/color'; -@import '../../../../../assets/scss/typography'; +@import 'color'; +@import 'typography'; form { max-width: 600px; diff --git a/src/app/header/header.component.scss b/src/app/header/header.component.scss index c6268c23d..e3224939d 100644 --- a/src/app/header/header.component.scss +++ b/src/app/header/header.component.scss @@ -1,11 +1,11 @@ -@import '../../assets/scss/icons'; -@import '../../assets/scss/typography'; -@import '../../assets/scss/layout'; -@import '../../assets/scss/color'; -@import '../../assets/scss/breakpoint'; -@import '../../assets/scss/shapes'; -@import '../../assets/scss/buttons'; -@import '../../assets/scss/z-index'; +@import 'icons'; +@import 'typography'; +@import 'layout'; +@import 'color'; +@import 'breakpoint'; +@import 'shapes'; +@import 'buttons'; +@import 'z-index'; .header { height: $header-height; diff --git a/src/app/login/login.component.scss b/src/app/login/login.component.scss index 1258e8406..ca9a419d6 100644 --- a/src/app/login/login.component.scss +++ b/src/app/login/login.component.scss @@ -1,7 +1,7 @@ -@import '../../assets/scss/color'; -@import '../../assets/scss/breakpoint'; -@import '../../assets/scss/layout'; -@import '../../assets/scss/typography'; +@import 'color'; +@import 'breakpoint'; +@import 'layout'; +@import 'typography'; .loginPage { display: flex; diff --git a/src/app/map/components/map.component.scss b/src/app/map/components/map.component.scss index a699808a9..f09fccb0d 100644 --- a/src/app/map/components/map.component.scss +++ b/src/app/map/components/map.component.scss @@ -1,11 +1,11 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/layout'; -@import '../../../assets/scss/icons'; -@import '../../../assets/scss/typography'; -@import '../../../assets/scss/shapes'; -@import '../../../assets/scss/buttons'; -@import '../../../assets/scss/breakpoint'; -@import '../../../assets/scss/z-index'; +@import 'color'; +@import 'layout'; +@import 'icons'; +@import 'typography'; +@import 'shapes'; +@import 'buttons'; +@import 'breakpoint'; +@import 'z-index'; #map { height: 100%; diff --git a/src/app/newsletter-subscription/newsletter-subscription.component.scss b/src/app/newsletter-subscription/newsletter-subscription.component.scss index bfb365f01..475da47e9 100644 --- a/src/app/newsletter-subscription/newsletter-subscription.component.scss +++ b/src/app/newsletter-subscription/newsletter-subscription.component.scss @@ -1,4 +1,4 @@ -@import '../../assets/scss/color'; +@import 'color'; .subscriptionPasswordForm { max-width: 500px; diff --git a/src/app/page/page.component.scss b/src/app/page/page.component.scss index 4a481e9e8..d11eb24f6 100644 --- a/src/app/page/page.component.scss +++ b/src/app/page/page.component.scss @@ -1,6 +1,6 @@ -@import '../../assets/scss/typography'; -@import '../../assets/scss/color'; -@import '../../assets/scss/ghost'; +@import 'typography'; +@import 'color'; +@import 'ghost'; .version { padding-top: 80px; diff --git a/src/app/post/components/post-card/post-card.component.scss b/src/app/post/components/post-card/post-card.component.scss index 80aa88d43..1631b25ac 100644 --- a/src/app/post/components/post-card/post-card.component.scss +++ b/src/app/post/components/post-card/post-card.component.scss @@ -1,6 +1,6 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; .post { cursor: pointer; diff --git a/src/app/post/components/post-details/post-details.component.scss b/src/app/post/components/post-details/post-details.component.scss index 6fdea57f0..3364f5c4b 100644 --- a/src/app/post/components/post-details/post-details.component.scss +++ b/src/app/post/components/post-details/post-details.component.scss @@ -1,9 +1,9 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/layout'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/hyperlink'; -@import '../../../../assets/scss/ghost'; +@import 'color'; +@import 'typography'; +@import 'layout'; +@import 'breakpoint'; +@import 'hyperlink'; +@import 'ghost'; .postContainer { .chevronLeft { diff --git a/src/app/post/components/post-header/post-header.component.scss b/src/app/post/components/post-header/post-header.component.scss index 73030c03e..f3947ac88 100644 --- a/src/app/post/components/post-header/post-header.component.scss +++ b/src/app/post/components/post-header/post-header.component.scss @@ -1,8 +1,8 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/buttons'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/layout'; +@import 'color'; +@import 'buttons'; +@import 'typography'; +@import 'breakpoint'; +@import 'layout'; h1 { .onlyOnDesktop { diff --git a/src/app/post/components/post-list/post-list.component.scss b/src/app/post/components/post-list/post-list.component.scss index f84f541f1..18feff330 100644 --- a/src/app/post/components/post-list/post-list.component.scss +++ b/src/app/post/components/post-list/post-list.component.scss @@ -1,7 +1,7 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/shapes'; -@import '../../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'shapes'; +@import 'breakpoint'; .section-container { background: $grey-8; diff --git a/src/app/post/components/post-modal-filters/post-modal-filters.component.scss b/src/app/post/components/post-modal-filters/post-modal-filters.component.scss index c3f7806a7..4051133ef 100644 --- a/src/app/post/components/post-modal-filters/post-modal-filters.component.scss +++ b/src/app/post/components/post-modal-filters/post-modal-filters.component.scss @@ -1,10 +1,10 @@ -@import '../../../../assets/scss/icons'; -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/shapes'; -@import '../../../../assets/scss/hyperlink'; -@import '../../../../assets/scss/z-index'; +@import 'icons'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; +@import 'shapes'; +@import 'hyperlink'; +@import 'z-index'; .modallocation { margin-left: -341px; diff --git a/src/app/post/components/post-publish/post-publish.component.scss b/src/app/post/components/post-publish/post-publish.component.scss index 371e56edc..342209276 100644 --- a/src/app/post/components/post-publish/post-publish.component.scss +++ b/src/app/post/components/post-publish/post-publish.component.scss @@ -1,6 +1,6 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/layout'; +@import 'color'; +@import 'typography'; +@import 'layout'; $margin-post: 20px; diff --git a/src/app/post/components/post-tag/post-tag.component.scss b/src/app/post/components/post-tag/post-tag.component.scss index 29b7f4e30..896797531 100644 --- a/src/app/post/components/post-tag/post-tag.component.scss +++ b/src/app/post/components/post-tag/post-tag.component.scss @@ -1,5 +1,5 @@ -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/color'; +@import 'typography'; +@import 'color'; .tag { @include lato-bold-16; diff --git a/src/app/profile/edit/edit.component.scss b/src/app/profile/edit/edit.component.scss index 23d539a0e..19ad102f2 100644 --- a/src/app/profile/edit/edit.component.scss +++ b/src/app/profile/edit/edit.component.scss @@ -1,8 +1,8 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/typography'; -@import '../../../assets/scss/hyperlink'; -@import '../../../assets/scss/shapes'; -@import '../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'hyperlink'; +@import 'shapes'; +@import 'breakpoint'; .edit-profile { display: flex; diff --git a/src/app/profile/personal-offer-edition/personal-offer-edition.component.scss b/src/app/profile/personal-offer-edition/personal-offer-edition.component.scss index d45b4da32..eb3a73d19 100644 --- a/src/app/profile/personal-offer-edition/personal-offer-edition.component.scss +++ b/src/app/profile/personal-offer-edition/personal-offer-edition.component.scss @@ -1,8 +1,8 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/typography'; -@import '../../../assets/scss/hyperlink'; -@import '../../../assets/scss/shapes'; -@import '../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'hyperlink'; +@import 'shapes'; +@import 'breakpoint'; .edit-personal-offer { display: flex; diff --git a/src/app/profile/profile-structure/personal-offer/personal-offer.component.scss b/src/app/profile/profile-structure/personal-offer/personal-offer.component.scss index b560ceccd..d78f5330e 100644 --- a/src/app/profile/profile-structure/personal-offer/personal-offer.component.scss +++ b/src/app/profile/profile-structure/personal-offer/personal-offer.component.scss @@ -1,5 +1,5 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; +@import 'color'; +@import 'typography'; .container { display: flex; diff --git a/src/app/profile/profile-structure/profile-structure-member/profile-structure-member.component.scss b/src/app/profile/profile-structure/profile-structure-member/profile-structure-member.component.scss index e3b3f8c87..7103a9073 100644 --- a/src/app/profile/profile-structure/profile-structure-member/profile-structure-member.component.scss +++ b/src/app/profile/profile-structure/profile-structure-member/profile-structure-member.component.scss @@ -1,7 +1,7 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/shapes'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; +@import 'shapes'; .structureMember { @include lato-regular-14; diff --git a/src/app/profile/profile-structure/profile-structure.component.scss b/src/app/profile/profile-structure/profile-structure.component.scss index 6bbe88124..0b23a41c4 100644 --- a/src/app/profile/profile-structure/profile-structure.component.scss +++ b/src/app/profile/profile-structure/profile-structure.component.scss @@ -1,7 +1,7 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/typography'; -@import '../../../assets/scss/breakpoint'; -@import '../../../assets/scss/shapes'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; +@import 'shapes'; .structureCard { padding: 8px 0; diff --git a/src/app/profile/profile.component.scss b/src/app/profile/profile.component.scss index a769958a5..1ba97cd12 100644 --- a/src/app/profile/profile.component.scss +++ b/src/app/profile/profile.component.scss @@ -1,9 +1,9 @@ -@import '../../assets/scss/color'; -@import '../../assets/scss/typography'; -@import '../../assets/scss/hyperlink'; -@import '../../assets/scss/shapes'; -@import '../../assets/scss/breakpoint'; -@import '../../assets/scss/layout'; +@import 'color'; +@import 'typography'; +@import 'hyperlink'; +@import 'shapes'; +@import 'breakpoint'; +@import 'layout'; .content-container { display: flex; diff --git a/src/app/profile/structure-add-member-modal/structure-add-member-modal.component.scss b/src/app/profile/structure-add-member-modal/structure-add-member-modal.component.scss index febea28dc..cc809729b 100644 --- a/src/app/profile/structure-add-member-modal/structure-add-member-modal.component.scss +++ b/src/app/profile/structure-add-member-modal/structure-add-member-modal.component.scss @@ -1,7 +1,7 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/typography'; -@import '../../../assets/scss/shapes'; -@import '../../../assets/scss/z-index'; +@import 'color'; +@import 'typography'; +@import 'shapes'; +@import 'z-index'; .modalBackground { .modal { diff --git a/src/app/profile/structure-edition-summary/missing-information/missing-information.component.scss b/src/app/profile/structure-edition-summary/missing-information/missing-information.component.scss index 7a947643f..ae41e903c 100644 --- a/src/app/profile/structure-edition-summary/missing-information/missing-information.component.scss +++ b/src/app/profile/structure-edition-summary/missing-information/missing-information.component.scss @@ -1,4 +1,4 @@ -@import '../../../../assets/scss/color'; +@import 'color'; p.warning { font-style: italic; diff --git a/src/app/profile/structure-edition-summary/no-information/no-information.component.scss b/src/app/profile/structure-edition-summary/no-information/no-information.component.scss index 3c2914dd8..73e27d47f 100644 --- a/src/app/profile/structure-edition-summary/no-information/no-information.component.scss +++ b/src/app/profile/structure-edition-summary/no-information/no-information.component.scss @@ -1,4 +1,4 @@ -@import '../../../../assets/scss/color'; +@import 'color'; .noInformation { color: $grey-3; diff --git a/src/app/profile/structure-edition-summary/structure-edition-summary.component.scss b/src/app/profile/structure-edition-summary/structure-edition-summary.component.scss index cc3b1efb8..038216a82 100644 --- a/src/app/profile/structure-edition-summary/structure-edition-summary.component.scss +++ b/src/app/profile/structure-edition-summary/structure-edition-summary.component.scss @@ -1,7 +1,7 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/typography'; -@import '../../../assets/scss/breakpoint'; -@import '../../../assets/scss/layout'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; +@import 'layout'; ::ng-deep svg { cursor: pointer; diff --git a/src/app/profile/structure-members-management/structure-members-management.component.scss b/src/app/profile/structure-members-management/structure-members-management.component.scss index c080de481..584527449 100644 --- a/src/app/profile/structure-members-management/structure-members-management.component.scss +++ b/src/app/profile/structure-members-management/structure-members-management.component.scss @@ -1,6 +1,6 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/typography'; -@import '../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; .container { margin: 0 auto 1rem auto; diff --git a/src/app/profile/structures-management/structures-management.component.scss b/src/app/profile/structures-management/structures-management.component.scss index daf9c5b08..182ba1a81 100644 --- a/src/app/profile/structures-management/structures-management.component.scss +++ b/src/app/profile/structures-management/structures-management.component.scss @@ -1,6 +1,6 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/typography'; -@import '../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; .container { margin: 1rem auto; diff --git a/src/app/reset-password/reset-password.component.scss b/src/app/reset-password/reset-password.component.scss index 7a69dc958..f0b8829e4 100644 --- a/src/app/reset-password/reset-password.component.scss +++ b/src/app/reset-password/reset-password.component.scss @@ -1,7 +1,7 @@ -@import '../../assets/scss/color'; -@import '../../assets/scss/typography'; -@import '../../assets/scss/breakpoint'; -@import '../../assets/scss/layout'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; +@import 'layout'; .resetPage { width: 100%; diff --git a/src/app/shared/components/accompaniment-picker/accompaniment-picker.component.scss b/src/app/shared/components/accompaniment-picker/accompaniment-picker.component.scss index 2ac0963fb..46e81fc09 100644 --- a/src/app/shared/components/accompaniment-picker/accompaniment-picker.component.scss +++ b/src/app/shared/components/accompaniment-picker/accompaniment-picker.component.scss @@ -1 +1 @@ -@import '../../../../assets/scss/buttons'; +@import 'buttons'; diff --git a/src/app/shared/components/address-autocomplete/address-autocomplete.component.scss b/src/app/shared/components/address-autocomplete/address-autocomplete.component.scss index 783129d4d..bba9bbfcc 100644 --- a/src/app/shared/components/address-autocomplete/address-autocomplete.component.scss +++ b/src/app/shared/components/address-autocomplete/address-autocomplete.component.scss @@ -1,4 +1,4 @@ -@import '../../../../assets/scss/color'; +@import 'color'; input#search-address { width: 400px; diff --git a/src/app/shared/components/button/button.component.scss b/src/app/shared/components/button/button.component.scss index ddf9f5c3f..fcfdc6592 100644 --- a/src/app/shared/components/button/button.component.scss +++ b/src/app/shared/components/button/button.component.scss @@ -1,7 +1,7 @@ -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/shapes'; +@import 'typography'; +@import 'color'; +@import 'breakpoint'; +@import 'shapes'; @mixin btn-bold { @include lato-bold-13; diff --git a/src/app/shared/components/checkbox-form/checkbox-form.component.scss b/src/app/shared/components/checkbox-form/checkbox-form.component.scss index 5dc27e2eb..fc853ae4d 100644 --- a/src/app/shared/components/checkbox-form/checkbox-form.component.scss +++ b/src/app/shared/components/checkbox-form/checkbox-form.component.scss @@ -1,5 +1,5 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; +@import 'color'; +@import 'typography'; button { width: 296px; diff --git a/src/app/shared/components/custom-modal/custom-modal.component.scss b/src/app/shared/components/custom-modal/custom-modal.component.scss index 08f5ac3c2..e9ce0e284 100644 --- a/src/app/shared/components/custom-modal/custom-modal.component.scss +++ b/src/app/shared/components/custom-modal/custom-modal.component.scss @@ -1,7 +1,7 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/shapes'; -@import '../../../../assets/scss/z-index'; +@import 'color'; +@import 'typography'; +@import 'shapes'; +@import 'z-index'; .modalBackground { .modal { diff --git a/src/app/shared/components/data-share-consent/data-share-consent.component.scss b/src/app/shared/components/data-share-consent/data-share-consent.component.scss index 2e1436a03..e838d29b7 100644 --- a/src/app/shared/components/data-share-consent/data-share-consent.component.scss +++ b/src/app/shared/components/data-share-consent/data-share-consent.component.scss @@ -1,9 +1,9 @@ -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/buttons'; -@import '../../../../assets/scss/z-index'; -@import '../../../../assets/scss/hyperlink'; +@import 'typography'; +@import 'breakpoint'; +@import 'color'; +@import 'buttons'; +@import 'z-index'; +@import 'hyperlink'; @import '../radio-form/radio-form.component.scss'; .modalBackground .modal { diff --git a/src/app/shared/components/hour-picker/hour-picker.component.scss b/src/app/shared/components/hour-picker/hour-picker.component.scss index 94e347ca7..2b7b5cb2d 100644 --- a/src/app/shared/components/hour-picker/hour-picker.component.scss +++ b/src/app/shared/components/hour-picker/hour-picker.component.scss @@ -1,6 +1,6 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/breakpoint'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; .days { display: grid; diff --git a/src/app/shared/components/logo-card/logo-card.component.scss b/src/app/shared/components/logo-card/logo-card.component.scss index 71f52c165..e2e77bc98 100644 --- a/src/app/shared/components/logo-card/logo-card.component.scss +++ b/src/app/shared/components/logo-card/logo-card.component.scss @@ -1,5 +1,5 @@ -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/color'; +@import 'typography'; +@import 'color'; img { margin-right: 16px; diff --git a/src/app/shared/components/modal-confirmation/modal-confirmation.component.scss b/src/app/shared/components/modal-confirmation/modal-confirmation.component.scss index 5cc9a355a..699a5fe9a 100644 --- a/src/app/shared/components/modal-confirmation/modal-confirmation.component.scss +++ b/src/app/shared/components/modal-confirmation/modal-confirmation.component.scss @@ -1,7 +1,7 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/shapes'; -@import '../../../../assets/scss/z-index'; +@import 'color'; +@import 'typography'; +@import 'shapes'; +@import 'z-index'; .modalBackground { .modal { diff --git a/src/app/shared/components/modal-join-confirmation/modal-join-confirmation.component.scss b/src/app/shared/components/modal-join-confirmation/modal-join-confirmation.component.scss index dd051ebb8..0c95626bc 100644 --- a/src/app/shared/components/modal-join-confirmation/modal-join-confirmation.component.scss +++ b/src/app/shared/components/modal-join-confirmation/modal-join-confirmation.component.scss @@ -1,7 +1,7 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/shapes'; -@import '../../../../assets/scss/z-index'; +@import 'color'; +@import 'typography'; +@import 'shapes'; +@import 'z-index'; .modalBackground { .modal { diff --git a/src/app/shared/components/password-form/password-form.component.scss b/src/app/shared/components/password-form/password-form.component.scss index c8a7fa3c4..2687d1723 100644 --- a/src/app/shared/components/password-form/password-form.component.scss +++ b/src/app/shared/components/password-form/password-form.component.scss @@ -1,7 +1,7 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/layout'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/typography'; +@import 'color'; +@import 'layout'; +@import 'breakpoint'; +@import 'typography'; .content { display: flex; flex-direction: column; diff --git a/src/app/shared/components/radio-form/radio-form.component.scss b/src/app/shared/components/radio-form/radio-form.component.scss index 6eddf95e5..e23b8d32a 100644 --- a/src/app/shared/components/radio-form/radio-form.component.scss +++ b/src/app/shared/components/radio-form/radio-form.component.scss @@ -1,5 +1,5 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; +@import 'color'; +@import 'typography'; svg { fill: $primary-color; diff --git a/src/app/shared/components/structure-detail-print/structure-detail-print.component.scss b/src/app/shared/components/structure-detail-print/structure-detail-print.component.scss index 803cfe07f..ffc7b1d02 100644 --- a/src/app/shared/components/structure-detail-print/structure-detail-print.component.scss +++ b/src/app/shared/components/structure-detail-print/structure-detail-print.component.scss @@ -1,9 +1,9 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/z-index'; -@import '../../../../assets/scss/layout'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/buttons'; +@import 'color'; +@import 'typography'; +@import 'z-index'; +@import 'layout'; +@import 'breakpoint'; +@import 'buttons'; h2 { margin-top: 0; diff --git a/src/app/shared/components/structure-list-print/structure-list-print.component.scss b/src/app/shared/components/structure-list-print/structure-list-print.component.scss index c935f0aaf..be9470d25 100644 --- a/src/app/shared/components/structure-list-print/structure-list-print.component.scss +++ b/src/app/shared/components/structure-list-print/structure-list-print.component.scss @@ -1,5 +1,5 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/layout'; +@import 'color'; +@import 'layout'; .list-to-print { height: 600px; diff --git a/src/app/shared/components/structure-type-picker/structure-type-picker.component.scss b/src/app/shared/components/structure-type-picker/structure-type-picker.component.scss index 923fb9d09..daf83a9b2 100644 --- a/src/app/shared/components/structure-type-picker/structure-type-picker.component.scss +++ b/src/app/shared/components/structure-type-picker/structure-type-picker.component.scss @@ -1,7 +1,7 @@ -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/shapes'; -@import '../../../../assets/scss/breakpoint'; +@import 'typography'; +@import 'color'; +@import 'shapes'; +@import 'breakpoint'; .typeContainer { display: flex; diff --git a/src/app/shared/components/svg-icon/svg-icon.component.scss b/src/app/shared/components/svg-icon/svg-icon.component.scss index 2b4fb3ebc..6ec39a1cc 100644 --- a/src/app/shared/components/svg-icon/svg-icon.component.scss +++ b/src/app/shared/components/svg-icon/svg-icon.component.scss @@ -1,4 +1,4 @@ -@import '../../../../assets/scss/color'; +@import 'color'; :host { display: flex; diff --git a/src/app/shared/components/text-input-modal/text-input-modal.component.scss b/src/app/shared/components/text-input-modal/text-input-modal.component.scss index a0e22082c..55de8e934 100644 --- a/src/app/shared/components/text-input-modal/text-input-modal.component.scss +++ b/src/app/shared/components/text-input-modal/text-input-modal.component.scss @@ -1,7 +1,7 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/shapes'; -@import '../../../../assets/scss/z-index'; +@import 'color'; +@import 'typography'; +@import 'shapes'; +@import 'z-index'; .modalBackground { .modal { diff --git a/src/app/shared/components/training-type-picker/training-type-picker.component.scss b/src/app/shared/components/training-type-picker/training-type-picker.component.scss index a85177b17..fd2066ad6 100644 --- a/src/app/shared/components/training-type-picker/training-type-picker.component.scss +++ b/src/app/shared/components/training-type-picker/training-type-picker.component.scss @@ -1,8 +1,8 @@ -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/shapes'; -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/buttons'; +@import 'typography'; +@import 'shapes'; +@import 'color'; +@import 'breakpoint'; +@import 'buttons'; .trainingContainer { padding-bottom: 0.5rem; diff --git a/src/app/structure-list/components/card/card.component.scss b/src/app/structure-list/components/card/card.component.scss index b1df19ac4..bf1bbe2e6 100644 --- a/src/app/structure-list/components/card/card.component.scss +++ b/src/app/structure-list/components/card/card.component.scss @@ -1,7 +1,7 @@ -@import '../../../../assets/scss/icons'; -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/breakpoint'; +@import 'icons'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; .structure { padding: 12px; diff --git a/src/app/structure-list/components/more-filters/more-filters.component.scss b/src/app/structure-list/components/more-filters/more-filters.component.scss index 24ce1fe4d..f4707ce90 100644 --- a/src/app/structure-list/components/more-filters/more-filters.component.scss +++ b/src/app/structure-list/components/more-filters/more-filters.component.scss @@ -1,11 +1,11 @@ -@import '../../../../assets/scss/icons'; -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/shapes'; -@import '../../../../assets/scss/hyperlink'; -@import '../../../../assets/scss/z-index'; -@import '../../../../assets/scss/search'; +@import 'icons'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; +@import 'shapes'; +@import 'hyperlink'; +@import 'z-index'; +@import 'search'; .modal { max-width: 380px; diff --git a/src/app/structure-list/components/structure-details/structure-details.component.scss b/src/app/structure-list/components/structure-details/structure-details.component.scss index fd8572e94..974e3e02e 100644 --- a/src/app/structure-list/components/structure-details/structure-details.component.scss +++ b/src/app/structure-list/components/structure-details/structure-details.component.scss @@ -1,8 +1,8 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/layout'; -@import '../../../../assets/scss/z-index'; +@import 'color'; +@import 'typography'; +@import 'breakpoint'; +@import 'layout'; +@import 'z-index'; a { padding: unset; diff --git a/src/app/structure-list/components/structure-list-search-print/structure-list-search-print.component.scss b/src/app/structure-list/components/structure-list-search-print/structure-list-search-print.component.scss index 2e955dd87..2fc5793d6 100644 --- a/src/app/structure-list/components/structure-list-search-print/structure-list-search-print.component.scss +++ b/src/app/structure-list/components/structure-list-search-print/structure-list-search-print.component.scss @@ -1,5 +1,5 @@ -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; +@import 'color'; +@import 'typography'; .page { display: flex; diff --git a/src/app/structure-list/components/structure-list-search/structure-list-search.component.scss b/src/app/structure-list/components/structure-list-search/structure-list-search.component.scss index e11e7224d..4439b14f7 100644 --- a/src/app/structure-list/components/structure-list-search/structure-list-search.component.scss +++ b/src/app/structure-list/components/structure-list-search/structure-list-search.component.scss @@ -1,9 +1,9 @@ -@import '../../../../assets/scss/search'; -@import '../../../../assets/scss/color'; -@import '../../../../assets/scss/typography'; -@import '../../../../assets/scss/inputs'; -@import '../../../../assets/scss/breakpoint'; -@import '../../../../assets/scss/buttons'; +@import 'search'; +@import 'color'; +@import 'typography'; +@import 'inputs'; +@import 'breakpoint'; +@import 'buttons'; .block { display: flex; diff --git a/src/app/structure-list/structure-list.component.scss b/src/app/structure-list/structure-list.component.scss index a3a525ef5..8c1d63084 100644 --- a/src/app/structure-list/structure-list.component.scss +++ b/src/app/structure-list/structure-list.component.scss @@ -1,7 +1,7 @@ -@import '../../assets/scss/color'; -@import '../../assets/scss/icons'; -@import '../../assets/scss/typography'; -@import '../../assets/scss/buttons'; +@import 'color'; +@import 'icons'; +@import 'typography'; +@import 'buttons'; .structureList-container { overflow-y: auto; diff --git a/src/app/structure/structure-exclude/structure-exclude.component.scss b/src/app/structure/structure-exclude/structure-exclude.component.scss index f44c598e7..ff268e44d 100644 --- a/src/app/structure/structure-exclude/structure-exclude.component.scss +++ b/src/app/structure/structure-exclude/structure-exclude.component.scss @@ -1,5 +1,5 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/typography'; +@import 'color'; +@import 'typography'; .modalBackground { .modal { diff --git a/src/app/structure/structure-join/structure-join.component.scss b/src/app/structure/structure-join/structure-join.component.scss index 9991939fb..1460904ae 100644 --- a/src/app/structure/structure-join/structure-join.component.scss +++ b/src/app/structure/structure-join/structure-join.component.scss @@ -1,5 +1,5 @@ -@import '../../../assets/scss/color'; -@import '../../../assets/scss/breakpoint'; +@import 'color'; +@import 'breakpoint'; .container { /* Auto layout */ diff --git a/src/assets/scss/_ghost.scss b/src/assets/scss/_ghost.scss index 5f5290901..4262d5670 100644 --- a/src/assets/scss/_ghost.scss +++ b/src/assets/scss/_ghost.scss @@ -1,7 +1,7 @@ -@import '../../assets/scss/color'; -@import '../../assets/scss/layout'; -@import '../../assets/scss/breakpoint'; -@import '../../assets/scss/hyperlink'; +@import 'color'; +@import 'layout'; +@import 'breakpoint'; +@import 'hyperlink'; $margin-post: 20px; diff --git a/src/styles.scss b/src/styles.scss index 53816bbc9..68647ddc2 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,14 +1,14 @@ /* You can add global styles to this file, and also import other style files */ -@import 'assets/scss/typography'; -@import 'assets/scss/z-index'; -@import 'assets/scss/color'; -@import 'assets/scss/breakpoint'; -@import 'assets/scss/icons'; -@import 'assets/scss/inputs'; -@import 'assets/scss/hyperlink'; -@import 'assets/scss/layout'; -@import 'assets/scss/buttons'; +@import 'typography'; +@import 'z-index'; +@import 'color'; +@import 'breakpoint'; +@import 'icons'; +@import 'inputs'; +@import 'hyperlink'; +@import 'layout'; +@import 'buttons'; @import '../node_modules/leaflet.locatecontrol/dist/L.Control.Locate.css'; @import '../node_modules/leaflet/dist/leaflet.css'; @import '../node_modules/ngx-toastr/toastr'; -- GitLab From 4376812c2ede567c5493eefd5c13f3eee9312844 Mon Sep 17 00:00:00 2001 From: Marlene Simondant <msimondant@grandlyon.com> Date: Thu, 4 May 2023 16:32:28 +0200 Subject: [PATCH 35/47] fix(structures): fix display of additional informations about online procedures --- .../structure-details/structure-details.component.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 1bf6b6a95..f2a9beee4 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 @@ -353,10 +353,10 @@ <div *ngFor="let accompagnement of structure.categoriesDisplay.onlineProcedures.sort()"> <app-logo-card [name]="accompagnement" /> </div> - <p *ngIf="structure.otherDescription" fxLayout="column"> - {{ structure.otherDescription }} - </p> </div> + <p *ngIf="structure.otherDescription" fxLayout="column"> + {{ structure.otherDescription }} + </p> </div> </div> -- GitLab From c54aab858cdd308101bc66292692272d8377214b Mon Sep 17 00:00:00 2001 From: Bastien Dumont <bdumont@grandlyon.com> Date: Tue, 9 May 2023 11:48:55 +0200 Subject: [PATCH 36/47] fix(mobile): use safe view height --- src/app/app.component.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/app.component.scss b/src/app/app.component.scss index 071f1c7c4..50bf8e16b 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -18,7 +18,7 @@ overflow-y: auto; overflow-x: hidden; position: relative; - height: calc(100vh - #{$header-height}); + height: calc(100svh - #{$header-height}); } .loader { -- GitLab From 1163760fd2caf39865888462ca92eb8846b67b0e Mon Sep 17 00:00:00 2001 From: Etienne LOUPIAS <eloupias@grandlyon.com> Date: Tue, 9 May 2023 14:15:23 +0000 Subject: [PATCH 37/47] feat(rdv): rdv disabled waiting for reworking --- .../accompaniment-type/accompaniment-type.component.ts | 3 ++- src/app/structure-list/components/card/card.component.html | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/form/orientation-form-view/online-demarch/online-demarch-common/accompaniment-type/accompaniment-type.component.ts b/src/app/form/orientation-form-view/online-demarch/online-demarch-common/accompaniment-type/accompaniment-type.component.ts index 80462c50f..7764df13b 100644 --- a/src/app/form/orientation-form-view/online-demarch/online-demarch-common/accompaniment-type/accompaniment-type.component.ts +++ b/src/app/form/orientation-form-view/online-demarch/online-demarch-common/accompaniment-type/accompaniment-type.component.ts @@ -18,11 +18,12 @@ export class AccompanimentTypeComponent implements OnInit { hint: "Le bénéficiaire pourra prendre contact avec la structure ou s'y rendre directement", key: OnlineDemarche.structureList, }, + /* rdv disabled waiting for reworking { title: 'Prendre RDV auprès d’un conseiller ou une conseillère numérique', hint: 'Redirection vers RDV Aide Numérique pour voir les disponibilités', key: OnlineDemarche.meetings, - }, + },*/ { title: 'Choisir un créneau de médiation numérique à distance', hint: 'Le bénéficiaire sera contacté par téléphone sur le créneau de son choix', diff --git a/src/app/structure-list/components/card/card.component.html b/src/app/structure-list/components/card/card.component.html index 3f9eba523..78113ca64 100644 --- a/src/app/structure-list/components/card/card.component.html +++ b/src/app/structure-list/components/card/card.component.html @@ -14,9 +14,10 @@ <div fxLayout="column" fxLayoutAlign="end"> <div fxLayout="row" class="structure-name-container"> <span class="structure-name" [ngClass]="{ notClaimed: !isClaimed }">{{ structure.structureName }}</span> + <!-- rdv disabled waiting for reworking <span *ngIf="structure.idCNFS && !isOrientation" class="rdv"> <app-svg-icon [type]="'ico'" [icon]="'rdv'" [iconColor]="'black'" [iconClass]="'icon-22'"></app-svg-icon> - </span> + </span> --> </div> <span class="typeStructure" [ngClass]="{ typeStructureOrientation: isOrientation }">{{ structure.getLabelTypeStructure() -- GitLab From 3723aff5297b498c4649840f8f8cf93f815a0ec2 Mon Sep 17 00:00:00 2001 From: Etienne LOUPIAS <eloupias@grandlyon.com> Date: Thu, 11 May 2023 13:59:05 +0200 Subject: [PATCH 38/47] fix(admin): merge employers --- .../manage-employers.component.ts | 132 +++++++++--------- 1 file changed, 67 insertions(+), 65 deletions(-) diff --git a/src/app/admin/components/manage-employers/manage-employers.component.ts b/src/app/admin/components/manage-employers/manage-employers.component.ts index 28b3db9af..9ba97d5f2 100644 --- a/src/app/admin/components/manage-employers/manage-employers.component.ts +++ b/src/app/admin/components/manage-employers/manage-employers.component.ts @@ -31,8 +31,10 @@ export class ManageEmployersComponent implements OnInit { }; public contextRow: any; + public columnDefs: ColDef<Employer>[]; + public unvalidEmployersColumnDefs: ColDef<Employer>[]; public frameworkComponents; - public defaultColDef: ColDef = { + public defaultColDef = { editable: true, sortable: true, flex: 1, @@ -40,75 +42,12 @@ export class ManageEmployersComponent implements OnInit { filter: true, resizable: true, }; - public unvalidColDef: ColDef = { + public unvalidColDef = { ...this.defaultColDef, cellStyle: { color: '#da6c2e', }, }; - public columnDefs: ColDef<Employer>[] = [ - { - headerName: 'Employeur', - field: 'name', - editable: true, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Acteurs rattachés', - cellRenderer: 'attachedUsersComponent', - cellRendererParams: { - users: 'users', - }, - minWidth: 500, - }, - { - headerName: 'Suppression', - editable: false, - minWidth: 100, - cellRenderer: 'deleteEmployerComponent', - cellRendererParams: { - onClick: this.onDeleteButtonClick.bind(this), - label: 'Supprimer', - }, - }, - ]; - public unvalidEmployersColumnDefs: ColDef<Employer>[] = [ - { - headerName: 'Employeur', - field: 'name', - editable: true, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Acteurs rattachés', - cellRenderer: 'attachedUsersComponent', - cellRendererParams: { - users: 'users', - }, - minWidth: 500, - }, - { - headerName: 'Fusionner', - field: '_id', - cellRenderer: 'employerRenderer', - singleClickEdit: true, - cellEditor: 'agSelectCellEditor', - cellEditorParams: { - values: this.validatedEmployersName, - }, - onCellValueChanged: this.onMerge.bind(this), - }, - { - headerName: 'Valider', - editable: false, - minWidth: 100, - cellRenderer: 'validateEmployerComponent', - cellRendererParams: { - onClick: this.onValidateButtonClick.bind(this), - label: 'Valider', - }, - }, - ]; constructor( private adminService: AdminService, @@ -117,6 +56,69 @@ export class ManageEmployersComponent implements OnInit { ) { this.findValidatedEmployers(); this.findUnvalidatedEmployers(); + this.unvalidEmployersColumnDefs = [ + { + headerName: 'Employeur', + field: 'name', + editable: true, + onCellValueChanged: this.onChange.bind(this), + }, + { + headerName: 'Acteurs rattachés', + cellRenderer: 'attachedUsersComponent', + cellRendererParams: { + users: 'users', + }, + minWidth: 500, + }, + { + headerName: 'Fusionner', + field: '_id', + cellRenderer: 'employerRenderer', + singleClickEdit: true, + cellEditor: 'agSelectCellEditor', + cellEditorParams: { + values: this.validatedEmployersName, + }, + onCellValueChanged: this.onMerge.bind(this), + }, + { + headerName: 'Valider', + editable: false, + minWidth: 100, + cellRenderer: 'validateEmployerComponent', + cellRendererParams: { + onClick: this.onValidateButtonClick.bind(this), + label: 'Valider', + }, + }, + ]; + this.columnDefs = [ + { + headerName: 'Employeur', + field: 'name', + editable: true, + onCellValueChanged: this.onChange.bind(this), + }, + { + headerName: 'Acteurs rattachés', + cellRenderer: 'attachedUsersComponent', + cellRendererParams: { + users: 'users', + }, + minWidth: 500, + }, + { + headerName: 'Suppression', + editable: false, + minWidth: 100, + cellRenderer: 'deleteEmployerComponent', + cellRendererParams: { + onClick: this.onDeleteButtonClick.bind(this), + label: 'Supprimer', + }, + }, + ]; this.frameworkComponents = { employerRenderer: EmployerRendererComponent, deleteEmployerComponent: DeleteEmployerComponent, -- GitLab From f73e426d3efe78c3b2402bdd45b1a1c21794af2d Mon Sep 17 00:00:00 2001 From: Etienne LOUPIAS <eloupias@grandlyon.com> Date: Mon, 15 May 2023 11:36:39 +0200 Subject: [PATCH 39/47] fix(carto): add osm attribution --- src/app/map/components/map.component.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/map/components/map.component.ts b/src/app/map/components/map.component.ts index b1bf2fa92..58a2c3108 100644 --- a/src/app/map/components/map.component.ts +++ b/src/app/map/components/map.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, HostListener, Input, OnChanges, Output, SimpleChanges } from '@angular/core'; -import L, { geoJSON, latLng, layerGroup, Map, MapOptions, tileLayer } from 'leaflet'; +import L, { Map, MapOptions, geoJSON, latLng, layerGroup, tileLayer } from 'leaflet'; import * as _ from 'lodash'; import metropole from '../../../assets/geojson/metropole.json'; import { Structure } from '../../models/structure.model'; @@ -248,7 +248,8 @@ export class MapComponent implements OnChanges { // Init WMS service with param from data.grandlyon.com layerGroup(); const carteLayer = tileLayer('https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png', { - attribution: '© <a href="https://carto.com/attributions">CARTO</a>', + attribution: + '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>, © <a href="https://carto.com/attributions">CARTO</a>', maxZoom: ZoomLevel.max, }); // Center is set on townhall -- GitLab From 24fb2b86630d4e6b6bca4c3101e4310b1a2b4238 Mon Sep 17 00:00:00 2001 From: Etienne LOUPIAS <eloupias@grandlyon.com> Date: Tue, 16 May 2023 10:32:01 +0200 Subject: [PATCH 40/47] fix(structure): can't remove opened day bug --- .../hour-picker/hour-picker.component.ts | 44 +++++++++---------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/src/app/shared/components/hour-picker/hour-picker.component.ts b/src/app/shared/components/hour-picker/hour-picker.component.ts index 38ec063e8..4b8ae1e30 100644 --- a/src/app/shared/components/hour-picker/hour-picker.component.ts +++ b/src/app/shared/components/hour-picker/hour-picker.component.ts @@ -95,31 +95,29 @@ export class HourPickerComponent implements OnChanges, OnDestroy { if (element.name.toLowerCase() === key) { element.open = day.open; element.active = day.open; - element.hours = day.time - .map((hour: Time) => { - if (hour.opening && hour.closing) { + element.hours = day.time.map((hour: Time) => { + if (hour.opening && hour.closing) { + return { + start: hour.opening, + end: hour.closing, + error: null, + }; + } else { + if (hour.opening) { return { start: hour.opening, - end: hour.closing, - error: null, + end: '', + error: 'incomplete', }; } else { - if (hour.opening) { - return { - start: hour.opening, - end: '', - error: 'incomplete', - }; - } else { - return { - start: '', - end: hour.closing, - error: 'incomplete', - }; - } + return { + start: '', + end: hour.closing, + error: 'incomplete', + }; } - }) - .filter((item) => item); + } + }); } }); this.checkHoursValid(); @@ -196,9 +194,9 @@ export class HourPickerComponent implements OnChanges, OnDestroy { } public toggleOpenDay(day: any, event: MouseEvent): void { - const target = event.target as HTMLButtonElement; - day.open = target.value; - if (!target.value) { + const target = event.target as HTMLInputElement; + day.open = target.checked; + if (!target.checked) { day.hours = []; } this.submitForm(); -- GitLab From 305cc35f31b33a717579a2caf4d04c5a9e558aab Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Tue, 16 May 2023 09:12:16 +0000 Subject: [PATCH 41/47] fix: adjust layout height --- src/app/app.component.scss | 6 ------ src/app/header/header.component.scss | 3 +++ src/styles.scss | 3 --- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/app/app.component.scss b/src/app/app.component.scss index 50bf8e16b..47450c164 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -2,11 +2,6 @@ @import 'color'; @import 'layout'; -.app-container { - display: block; - flex-direction: column; -} - @media print { .app-body { height: 100% !important; @@ -18,7 +13,6 @@ overflow-y: auto; overflow-x: hidden; position: relative; - height: calc(100svh - #{$header-height}); } .loader { diff --git a/src/app/header/header.component.scss b/src/app/header/header.component.scss index e3224939d..485808c27 100644 --- a/src/app/header/header.component.scss +++ b/src/app/header/header.component.scss @@ -15,6 +15,9 @@ border-bottom: solid 1px $grey-4; background-color: $white; padding: 0 20px; + position: sticky; + top: 0; + z-index: 50; .right-header { @media #{$tablet} { display: none !important; diff --git a/src/styles.scss b/src/styles.scss index 68647ddc2..2ce37610a 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -28,9 +28,6 @@ body { padding: 0; color: $black; background-color: $grey-8; - min-height: 100vh; - min-height: -webkit-fill-available; - overflow: hidden; ::-webkit-scrollbar { width: 8px; } -- GitLab From e2a71c76cb1e9c9657f2c0c39aeface63232f48f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marl=C3=A8ne=20SIMONDANT?= <msimondant@grandlyon.com> Date: Tue, 16 May 2023 15:04:06 +0000 Subject: [PATCH 42/47] fix(structureCreation): disable button on structure creation --- src/app/form/form-view/form-view.component.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/form/form-view/form-view.component.ts b/src/app/form/form-view/form-view.component.ts index 4b4df7531..452c7e074 100644 --- a/src/app/form/form-view/form-view.component.ts +++ b/src/app/form/form-view/form-view.component.ts @@ -311,6 +311,8 @@ export class FormViewComponent implements OnInit, AfterViewInit { } } if (type.formStep === structureFormStep.structureCreationFinishedInfo) { + // disable button to avoid multiple click that may create several identical structures + this.isPageValid = false; this.saveStructureForm(); } if (type.formStep === structureFormStep.noStructure) { -- GitLab From 0b382e4d68baa2c04beb44a4a15eb2395a953f53 Mon Sep 17 00:00:00 2001 From: Bastien DUMONT <bdumont@grandlyon.com> Date: Wed, 17 May 2023 12:30:48 +0000 Subject: [PATCH 43/47] chore: fix layout on some pages --- src/app/annuaire/annuaire.component.scss | 1 + src/app/app-routing.module.ts | 1 - src/app/login/login.component.scss | 50 ++++++++++++------------ 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/app/annuaire/annuaire.component.scss b/src/app/annuaire/annuaire.component.scss index e66c8fb0b..25f45664e 100644 --- a/src/app/annuaire/annuaire.component.scss +++ b/src/app/annuaire/annuaire.component.scss @@ -5,6 +5,7 @@ display: flex; flex-direction: column; justify-content: center; + height: calc(100vh - $header-height - $footer-height); &.logged { justify-content: flex-start; } diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index a5f733049..1e510d4de 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -268,7 +268,6 @@ const routes: Routes = [ canActivate: [AdminGuard], loadChildren: () => import('./admin/admin.module').then((m) => m.AdminModule), }, - footerOutletRoute, ], }, { diff --git a/src/app/login/login.component.scss b/src/app/login/login.component.scss index ca9a419d6..ffd74fcd4 100644 --- a/src/app/login/login.component.scss +++ b/src/app/login/login.component.scss @@ -4,23 +4,32 @@ @import 'typography'; .loginPage { + height: calc(100vh - $header-height - $footer-height); display: flex; - width: 100%; - max-width: 980px; - box-sizing: border-box; - margin: auto; - margin-top: 2rem; - min-height: 450px; - max-height: 80vh; - overflow-y: auto; - color: $grey-1; - background: $white; - border-radius: 8px; - border: 1px solid $grey-6; - padding: 70px 40px; - @media #{$desktop} { + justify-content: center; + align-items: center; + + @media #{$phone} { padding: 1rem; - margin-top: 1rem; + align-items: flex-start; + } + + .form { + display: flex; + flex-direction: column; + align-items: center; + overflow-y: auto; + width: 100%; + max-width: 980px; + box-sizing: border-box; + color: $grey-1; + background: $white; + border-radius: 8px; + border: 1px solid $grey-6; + padding: 70px 40px; + * { + max-width: 340px; + } } .title { @@ -42,11 +51,6 @@ color: $orange-warning; } - .form { - max-width: 340px; - margin: auto; - } - .form-group { margin: 1.5rem 0; .notValidate { @@ -110,9 +114,3 @@ } } } - -@media #{$tablet} { - .loginPage { - height: 100%; - } -} -- GitLab From 2e2965885b58aeec33b31e25c37c1e472e555098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marl=C3=A8ne=20SIMONDANT?= <msimondant@grandlyon.com> Date: Wed, 17 May 2023 13:26:04 +0000 Subject: [PATCH 44/47] Fix(burgerMenu): close menu on click on registry link --- src/app/header/header.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html index 120cc5c2f..184e0fba4 100644 --- a/src/app/header/header.component.html +++ b/src/app/header/header.component.html @@ -73,7 +73,7 @@ <a routerLink="/orientation" [routerLinkActive]="'active'" (click)="closeMenu()" i18n >Orienter un bénéficiaire</a > - <a routerLink="/annuaire" [routerLinkActive]="'active'" i18n>Annuaire</a> + <a routerLink="/annuaire" [routerLinkActive]="'active'" i18n (click)="closeMenu()">Annuaire</a> <a routerLink="/page/qui-sommes-nous" [routerLinkActive]="'active'" (click)="closeMenu()" i18n >Qui sommes-nous ?</a > -- GitLab From 04e8939edfb780eeb06d204cc96c3176d7f47127 Mon Sep 17 00:00:00 2001 From: Etienne LOUPIAS <eloupias@grandlyon.com> Date: Wed, 17 May 2023 13:54:58 +0000 Subject: [PATCH 45/47] fix(structure): the deletedAt field must not be set to have the structure visible --- src/app/models/structure.model.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/models/structure.model.ts b/src/app/models/structure.model.ts index 2ef456779..67611ab11 100644 --- a/src/app/models/structure.model.ts +++ b/src/app/models/structure.model.ts @@ -15,8 +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; + /** This value is only available as an admin. It must not be set to have the structure visible */ + public deletedAt?: string; public toBeDeletedAt?: string = null; public structureName: string = null; public structureType?: StructureType = null; -- GitLab From d448c49f899759b70b4c23724c4f4c39b04f0098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marl=C3=A8ne=20SIMONDANT?= <msimondant@grandlyon.com> Date: Tue, 23 May 2023 08:11:22 +0000 Subject: [PATCH 46/47] feat(admin): manage jobs groups --- src/app/admin/admin.module.ts | 4 + src/app/admin/admin.scss | 1 + .../attached-jobs.component.html | 3 + .../attached-jobs/attached-jobs.component.ts | 14 ++ .../delete-jobs-group.component.html | 1 + .../delete-jobs-group.component.spec.ts | 23 ++ .../delete-jobs-group.component.ts | 23 ++ .../manage-jobs/manage-jobs.component.html | 40 ++- .../manage-jobs/manage-jobs.component.ts | 238 +++++++++++++++--- src/app/admin/services/admin.service.ts | 27 ++ .../search-bar/search-bar.component.ts | 2 +- src/app/models/job.model.ts | 3 + src/app/models/jobGroup.model.ts | 8 + .../structure-list/services/search.service.ts | 9 +- 14 files changed, 346 insertions(+), 50 deletions(-) create mode 100644 src/app/admin/components/manage-jobs/attached-jobs/attached-jobs.component.html create mode 100644 src/app/admin/components/manage-jobs/attached-jobs/attached-jobs.component.ts create mode 100644 src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.html create mode 100644 src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.spec.ts create mode 100644 src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.ts create mode 100644 src/app/models/jobGroup.model.ts diff --git a/src/app/admin/admin.module.ts b/src/app/admin/admin.module.ts index 31320291c..498247f2f 100644 --- a/src/app/admin/admin.module.ts +++ b/src/app/admin/admin.module.ts @@ -9,8 +9,10 @@ import { ManageLockdownInfoComponent } from './components/lockdown-info/manage-l import { DeleteEmployerComponent } from './components/manage-employers/delete-employer/delete-employer.component'; import { ManageEmployersComponent } from './components/manage-employers/manage-employers.component'; import { ValidateEmployerComponent } from './components/manage-employers/validate-employer/validate-employer.component'; +import { AttachedJobsComponent } from './components/manage-jobs/attached-jobs/attached-jobs.component'; import { AttachedUsersComponent } from './components/manage-jobs/attached-users/attached-users.component'; import { DeleteJobComponent } from './components/manage-jobs/delete-job/delete-job.component'; +import { DeleteJobsGroupComponent } from './components/manage-jobs/delete-jobs-group/delete-jobs-group.component'; import { JobPersonalOfferComponent } from './components/manage-jobs/jobPersonalOffer/job-personal-offer'; import { ManageJobsComponent } from './components/manage-jobs/manage-jobs.component'; import { ValidateJobComponent } from './components/manage-jobs/validate-job/validate-job.component'; @@ -35,9 +37,11 @@ import { AdminStructuresListComponent } from './components/structures-list/admin ValidateEmployerComponent, DeleteUserComponent, DeleteJobComponent, + DeleteJobsGroupComponent, DeleteEmployerComponent, AdministredStructuresComponent, AttachedUsersComponent, + AttachedJobsComponent, ManageJobsComponent, ManageEmployersComponent, DeletedStructuresComponent, diff --git a/src/app/admin/admin.scss b/src/app/admin/admin.scss index d46c36d05..675b68fb2 100644 --- a/src/app/admin/admin.scss +++ b/src/app/admin/admin.scss @@ -5,6 +5,7 @@ flex-direction: column; align-items: center; margin: auto; + padding-bottom: 1rem; width: 80%; } diff --git a/src/app/admin/components/manage-jobs/attached-jobs/attached-jobs.component.html b/src/app/admin/components/manage-jobs/attached-jobs/attached-jobs.component.html new file mode 100644 index 000000000..aecfff7d0 --- /dev/null +++ b/src/app/admin/components/manage-jobs/attached-jobs/attached-jobs.component.html @@ -0,0 +1,3 @@ +<div *ngIf="attachedJobs.data.jobs?.length !== 0"> + <span *ngFor="let job of attachedJobs.data.jobs"> {{ job.name }}<br /> </span> +</div> diff --git a/src/app/admin/components/manage-jobs/attached-jobs/attached-jobs.component.ts b/src/app/admin/components/manage-jobs/attached-jobs/attached-jobs.component.ts new file mode 100644 index 000000000..dc601dc8e --- /dev/null +++ b/src/app/admin/components/manage-jobs/attached-jobs/attached-jobs.component.ts @@ -0,0 +1,14 @@ +import { Component } from '@angular/core'; +import { ICellRendererParams } from 'ag-grid-community'; + +@Component({ + selector: 'app-attached-jobs', + templateUrl: './attached-jobs.component.html', +}) +export class AttachedJobsComponent { + public attachedJobs: ICellRendererParams; + + public agInit(params: ICellRendererParams): void { + this.attachedJobs = params; + } +} diff --git a/src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.html b/src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.html new file mode 100644 index 000000000..9c0b02eff --- /dev/null +++ b/src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.html @@ -0,0 +1 @@ +<button type="button" (click)="onClick()">{{ label }}</button> diff --git a/src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.spec.ts b/src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.spec.ts new file mode 100644 index 000000000..42a80456c --- /dev/null +++ b/src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { DeleteJobsGroupComponent } from './delete-jobs-group.component'; + +describe('DeleteJonsGroupComponent', () => { + let component: DeleteJobsGroupComponent; + let fixture: ComponentFixture<DeleteJobsGroupComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [DeleteJobsGroupComponent], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(DeleteJobsGroupComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.ts b/src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.ts new file mode 100644 index 000000000..e43c2e7bf --- /dev/null +++ b/src/app/admin/components/manage-jobs/delete-jobs-group/delete-jobs-group.component.ts @@ -0,0 +1,23 @@ +import { Component } from '@angular/core'; +import { ICellRendererParams } from 'ag-grid-community'; + +type DeleteJobsCellRendererParams = ICellRendererParams & { label: string; onClick: Function }; +@Component({ + selector: 'app-delete-jobs-group', + templateUrl: './delete-jobs-group.component.html', +}) +export class DeleteJobsGroupComponent { + public params: DeleteJobsCellRendererParams; + public label: string; + + public agInit(params: DeleteJobsCellRendererParams): void { + this.params = params; + this.label = this.params.label || null; + } + + public onClick(): void { + if (this.params.onClick instanceof Function) { + this.params.onClick(this.params); + } + } +} diff --git a/src/app/admin/components/manage-jobs/manage-jobs.component.html b/src/app/admin/components/manage-jobs/manage-jobs.component.html index efb928223..67a846d55 100644 --- a/src/app/admin/components/manage-jobs/manage-jobs.component.html +++ b/src/app/admin/components/manage-jobs/manage-jobs.component.html @@ -16,7 +16,7 @@ style="width: 100%" [rowData]="unvalidatedJobs" [columnDefs]="unvalidJobsColumnDefs" - [getRowHeight]="getRowHeight" + [getRowHeight]="getUsersRowHeight" [defaultColDef]="unvalidColDef" [frameworkComponents]="frameworkComponents" > @@ -31,7 +31,7 @@ style="width: 100%" [rowData]="validatedJobs" [columnDefs]="columnDefs" - [getRowHeight]="getRowHeight" + [getRowHeight]="getUsersRowHeight" [defaultColDef]="defaultColDef" [frameworkComponents]="frameworkComponents" > @@ -42,11 +42,39 @@ <input type="text" maxlength="100" formControlName="job" class="form-input" /> <button type="submit" [ngClass]="{ invalid: !newJobForm.valid }">Créer</button> </form> + + <div fxLayout="column" fxLayoutGap="5px" fxLayoutAlign="center center" class="userBlock"> + <h2> + Gestion des groupes de fonctions + <span *ngIf="jobsGroups"> ({{ jobsGroups.length }}) </span> + </h2> + </div> + + <ag-grid-angular + *ngIf="jobsGroups" + class="ag-theme-alpine user-table" + rowSelection="multiple" + domLayout="autoHeight" + style="width: 100%" + [rowData]="jobsGroups" + [columnDefs]="columnDefsJobsGroups" + [getRowHeight]="getJobsRowHeight" + [defaultColDef]="defaultColDef" + [frameworkComponents]="frameworkComponents" + > + </ag-grid-angular> + + <h3 class="title">Créer un nouveau groupe de fonctions</h3> + <form [formGroup]="newJobsGroupForm" (ngSubmit)="onSubmitNewJobsGroup()"> + <input type="text" maxlength="100" formControlName="jobsGroup" class="form-input" /> + <button type="submit" [ngClass]="{ invalid: !newJobsGroupForm.valid }">Créer</button> + </form> </div> + <app-modal-confirmation *ngIf="jobToDelete" [opened]="deleteModalOpened" - [content]="'Voulez-vous vraiment supprimer cette fonction ? (' + jobToDelete.name + ')'" + [content]="'Voulez-vous vraiment supprimer la fonction ' + jobToDelete.name + ' ?'" (closed)="deleteJob(jobToDelete, $event)" /> <app-modal-confirmation @@ -55,3 +83,9 @@ [content]="'Voulez-vous vraiment fusionner cette fonction avec : ' + mergeOpe.newJob.name" (closed)="mergeJob(mergeOpe.newJob._id, mergeOpe.formerId, $event, contextRow)" /> +<app-modal-confirmation + *ngIf="jobsGroupToDelete" + [opened]="deleteJobsGroupModalOpened" + [content]="'Voulez-vous vraiment supprimer le groupe de fonctions ' + jobsGroupToDelete.name + ' ?'" + (closed)="deleteJobsGroup(jobsGroupToDelete, $event)" +/> diff --git a/src/app/admin/components/manage-jobs/manage-jobs.component.ts b/src/app/admin/components/manage-jobs/manage-jobs.component.ts index 5b673e258..ce375d789 100644 --- a/src/app/admin/components/manage-jobs/manage-jobs.component.ts +++ b/src/app/admin/components/manage-jobs/manage-jobs.component.ts @@ -2,11 +2,14 @@ import { Component, OnInit } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { ColDef, ValueGetterParams } from 'ag-grid-community'; import { Job } from '../../../models/job.model'; +import { JobGroup } from '../../../models/jobGroup.model'; import { NotificationService } from '../../../services/notification.service'; import { AdminService } from '../../services/admin.service'; import { JobRendererComponent } from '../manage-users/job-renderer/job-renderer.component'; +import { AttachedJobsComponent } from './attached-jobs/attached-jobs.component'; import { AttachedUsersComponent } from './attached-users/attached-users.component'; import { DeleteJobComponent } from './delete-job/delete-job.component'; +import { DeleteJobsGroupComponent } from './delete-jobs-group/delete-jobs-group.component'; import { JobPersonalOfferComponent } from './jobPersonalOffer/job-personal-offer'; import { ValidateJobComponent } from './validate-job/validate-job.component'; @@ -19,10 +22,16 @@ export class ManageJobsComponent implements OnInit { public newJobForm: UntypedFormGroup; public validatedJobs: Job[] = []; public unvalidatedJobs: Job[] = []; + public jobsGroups: JobGroup[] = []; public deleteModalOpened = false; public validatedJobsName: string[] = []; public mergeJobModalOpened = false; public jobToDelete: Job = null; + public jobsGroupsName: string[] = []; + public newJobsGroupForm: UntypedFormGroup; + public deleteJobsGroupModalOpened = false; + public jobsGroupToDelete: JobGroup = null; + public jobsGroupToEdit: string = null; public mergeOpe: any = { newJob: { name: null, @@ -33,6 +42,8 @@ export class ManageJobsComponent implements OnInit { }; public contextRow: any; + public columnDefs: ColDef<Job>[]; + public columnDefsJobsGroups: ColDef<Job>[]; public unvalidJobsColumnDefs: ColDef<Job>[]; public frameworkComponents; public defaultColDef: ColDef = { @@ -49,44 +60,6 @@ export class ManageJobsComponent implements OnInit { color: '#da6c2e', }, }; - public columnDefs: ColDef<Job>[] = [ - { - headerName: 'Fonction', - field: 'name', - editable: true, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Offre de service', - field: 'hasPersonalOffer', - cellRenderer: 'jobPersonalOffer', - cellEditor: 'agSelectCellEditor', - valueGetter: this.translateBoolean, - singleClickEdit: true, - cellEditorParams: { - values: [true, false], - }, - onCellValueChanged: this.onChange.bind(this), - }, - { - headerName: 'Acteurs rattachés', - cellRenderer: 'attachedUsersComponent', - cellRendererParams: { - users: 'users', - }, - minWidth: 500, - }, - { - headerName: 'Suppression', - editable: false, - minWidth: 100, - cellRenderer: 'deleteJobComponent', - cellRendererParams: { - onClick: this.onDeleteButtonClick.bind(this), - label: 'Supprimer', - }, - }, - ]; constructor( private adminService: AdminService, @@ -95,6 +68,8 @@ export class ManageJobsComponent implements OnInit { ) { this.findValidatedJobs(); this.findUnvalidatedJobs(); + this.getJobsGroupsWithJobs(); + this.initColumnDef(); this.unvalidJobsColumnDefs = [ { headerName: 'Fonction', @@ -145,11 +120,38 @@ export class ManageJobsComponent implements OnInit { }, }, ]; + this.columnDefsJobsGroups = [ + { + headerName: 'Nom', + field: 'name', + editable: true, + onCellValueChanged: this.onEdit.bind(this), + minWidth: 200, + }, + { + headerName: 'Fonctions rattachées', + editable: false, + cellRenderer: 'attachedJobsComponent', + minWidth: 200, + }, + { + headerName: 'Suppression', + editable: false, + minWidth: 100, + cellRenderer: 'deleteJobsGroupComponent', + cellRendererParams: { + onClick: this.onDeleteJobsGroupClick.bind(this), + label: 'Supprimer', + }, + }, + ]; this.frameworkComponents = { jobRenderer: JobRendererComponent, jobPersonalOffer: JobPersonalOfferComponent, deleteJobComponent: DeleteJobComponent, + deleteJobsGroupComponent: DeleteJobsGroupComponent, validateJobComponent: ValidateJobComponent, + attachedJobsComponent: AttachedJobsComponent, attachedUsersComponent: AttachedUsersComponent, }; } @@ -158,6 +160,63 @@ export class ManageJobsComponent implements OnInit { this.newJobForm = this.formBuilder.group({ job: ['', Validators.required], }); + this.newJobsGroupForm = this.formBuilder.group({ + jobsGroup: ['', Validators.required], + }); + } + + private initColumnDef(): void { + this.columnDefs = [ + { + headerName: 'Fonction', + field: 'name', + editable: true, + onCellValueChanged: this.onChange.bind(this), + minWidth: 200, + }, + { + headerName: 'Offre de service', + field: 'hasPersonalOffer', + cellRenderer: 'jobPersonalOffer', + cellEditor: 'agSelectCellEditor', + valueGetter: this.translateBoolean, + singleClickEdit: true, + cellEditorParams: { + values: [true, false], + }, + onCellValueChanged: this.onChange.bind(this), + }, + { + headerName: 'Acteurs rattachés', + cellRenderer: 'attachedUsersComponent', + cellRendererParams: { + users: 'users', + }, + minWidth: 350, + }, + { + headerName: 'Groupe de fonctions', + field: 'jobsGroup.name', + minWidth: 100, + cellEditor: 'agSelectCellEditor', + // Ag select cell editor doesn't accept an object a parameter. + // Only giving name to display in the select, then recompose the full object when filter on change. + cellEditorParams: { + values: this.jobsGroupsName, + }, + onCellValueChanged: this.onJobsGroupChange.bind(this), + }, + { + headerName: 'Suppression', + editable: false, + minWidth: 100, + cellRenderer: 'deleteJobComponent', + cellRendererParams: { + onClick: this.onDeleteButtonClick.bind(this), + label: 'Supprimer', + }, + }, + ]; } public onDeleteButtonClick(arg): void { @@ -268,8 +327,12 @@ export class ManageJobsComponent implements OnInit { this.validatedJobsName = []; this.adminService.getValidatedJobs().subscribe((jobs) => { this.validatedJobs = jobs; - jobs.map((job) => { + jobs.forEach((job) => { this.validatedJobsName.push(job.name); + // The field: 'jobsGroup.name' need an empty string if no jobsGroup + if (!job.jobsGroup) { + job.jobsGroup = { name: '' }; + } }); }); } @@ -280,7 +343,100 @@ export class ManageJobsComponent implements OnInit { }); } - public getRowHeight(params): number { - return params.data.users ? (params.data.users.length != 0 ? params.data.users.length * 40 : 40) : 40; + public getJobsGroupsWithJobs(): void { + this.jobsGroupsName = []; + this.adminService.getJobsGroupsWithJobs().subscribe((jobsGrps) => { + this.jobsGroups = jobsGrps; + jobsGrps.forEach((jobsGroup) => { + this.jobsGroupsName.push(jobsGroup.name); + }); + }); + } + + public onSubmitNewJobsGroup(): void { + if (!this.newJobsGroupForm.valid) { + return; + } + const nameJobsGroup: string = this.newJobsGroupForm.value.jobsGroup; + this.adminService.createJobsGroup(nameJobsGroup).subscribe( + () => { + this.getJobsGroupsWithJobs(); + this.newJobsGroupForm.reset(); + this.initColumnDef(); + + this.notificationService.showSuccess('Le nouveau groupe de fonctions a bien été créé'); + }, + (err) => { + this.notificationService.showError(`${err.error.message}`, 'Une erreur est survenue'); + } + ); + } + + public onEdit(arg): void { + if (arg.oldValue === arg.newValue) { + return; + } else { + this.adminService.editJobsGroup(arg.data._id, arg.data.name).subscribe(() => { + this.notificationService.showSuccess( + 'Le groupe de fonction ' + arg.oldValue + ' à bien été remplacé par ' + arg.data.name + '.', + '' + ); + this.getJobsGroupsWithJobs(); + this.initColumnDef(); + }); + } + } + + public onJobsGroupChange(arg): void { + const selectedJob = this.validatedJobs.find((job) => job._id === arg.data._id); + const selectedJobsGroup = this.jobsGroups.find((jobsGroup) => jobsGroup.name === arg.newValue); + + // The column field is the jobsGroup.name text, we manually assign in selectedJob the full jobsGroup object to be consistent + selectedJob.jobsGroup = { ...selectedJobsGroup }; + + this.adminService.updateJob(arg.data._id, selectedJob).subscribe(() => { + this.getJobsGroupsWithJobs(); + this.newJobsGroupForm.reset(); + + this.notificationService.showSuccess( + `Le groupe de fonctions ${selectedJobsGroup.name} a bien été attribuée à la fonction ${arg.data.name}.` + ); + }); + + return; + } + + public toggleDeleteJobsGroupModal(jobsGroupToDelete: JobGroup): void { + this.jobsGroupToDelete = jobsGroupToDelete; + this.deleteJobsGroupModalOpened = !this.deleteJobsGroupModalOpened; + } + + public onDeleteJobsGroupClick(arg): void { + this.deleteJobsGroup(arg.data, false); + } + + public deleteJobsGroup(jobGroup: JobGroup, shouldDelete: boolean): void { + this.toggleDeleteJobsGroupModal(jobGroup); + if (shouldDelete) { + this.adminService.deleteJobsGroup(jobGroup._id).subscribe( + (data) => { + this.getJobsGroupsWithJobs(); + this.newJobsGroupForm.reset(); + this.initColumnDef(); + this.notificationService.showSuccess('Le groupe de fonctions a bien été supprimé.'); + }, + (err) => { + this.notificationService.showError(`${err.error.message}`, 'Une erreur est survenue'); + } + ); + } + } + + public getUsersRowHeight(params): number { + return params.data.users && params.data.users.length !== 0 ? params.data.users.length * 40 : 40; + } + + public getJobsRowHeight(params): number { + return params.data.jobs && params.data.jobs.length !== 0 ? params.data.jobs.length * 40 : 40; } } diff --git a/src/app/admin/services/admin.service.ts b/src/app/admin/services/admin.service.ts index bd98249d5..bcbb2b2d5 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 { JobGroup } from '../../models/jobGroup.model'; import { Structure } from '../../models/structure.model'; import { User } from '../../models/user.model'; import { AdminStructureList } from '../models/adminStructureList.interface'; @@ -15,6 +16,7 @@ export class AdminService { private readonly baseUrl = 'api/admin'; private readonly jobBaseUrl = 'api/jobs'; private readonly employerBaseUrl = 'api/employer'; + private readonly jobsGroupBaseUrl = 'api/jobs-groups'; constructor(private http: HttpClient) {} // Return pendingAttachments of all profiles. @@ -76,6 +78,27 @@ export class AdminService { return this.http.get<Job[]>(`${this.jobBaseUrl}/validated`); } + // populate with jobs groups for admin purposes + public getJobsGroups(): Observable<JobGroup[]> { + return this.http.get<JobGroup[]>(`${this.jobsGroupBaseUrl}`); + } + + public getJobsGroupsWithJobs(): Observable<JobGroup[]> { + return this.http.get<JobGroup[]>(`${this.jobsGroupBaseUrl}/with-jobs`); + } + + public createJobsGroup(name: string): Observable<JobGroup> { + return this.http.post<JobGroup>(`${this.jobsGroupBaseUrl}`, { name }); + } + + public deleteJobsGroup(id: string): Observable<JobGroup> { + return this.http.delete<JobGroup>(`${this.jobsGroupBaseUrl}/${id}`); + } + + public editJobsGroup(id: string, name: string): Observable<JobGroup> { + return this.http.put<Job>(`${this.jobsGroupBaseUrl}/${id}/`, { name }); + } + public getUnvalidatedEmployers(): Observable<Employer[]> { return this.http.get<Employer[]>(`${this.employerBaseUrl}/unvalidated`); } @@ -104,6 +127,10 @@ export class AdminService { return this.http.post<Job>(`${this.jobBaseUrl}`, { name, hasPersonalOffer: true }); } + public updateJob(id: string, job: Job): Observable<Job> { + return this.http.put<Job>(`${this.jobBaseUrl}/${id}`, job); + } + public createEmployer(name: string): Observable<Employer> { return this.http.post<Employer>(`${this.employerBaseUrl}`, { name }); } diff --git a/src/app/annuaire/search-bar/search-bar.component.ts b/src/app/annuaire/search-bar/search-bar.component.ts index a6f0f5bc7..90e29f3c1 100644 --- a/src/app/annuaire/search-bar/search-bar.component.ts +++ b/src/app/annuaire/search-bar/search-bar.component.ts @@ -82,7 +82,7 @@ export class SearchBarComponent implements OnInit, OnChanges { private async loadFilters(): Promise<void> { const { job, employer } = await lastValueFrom( forkJoin({ - job: this.searchService.getJobs(), + job: this.searchService.getJobsGroups(), employer: this.searchService.getEmployers(), }) ); diff --git a/src/app/models/job.model.ts b/src/app/models/job.model.ts index e38c43512..ba9ab52bc 100644 --- a/src/app/models/job.model.ts +++ b/src/app/models/job.model.ts @@ -1,8 +1,11 @@ +import { JobGroup } from './jobGroup.model'; + export class Job { _id?: string; name: string; hasPersonalOffer: boolean = true; validated: boolean = false; + jobsGroup?: JobGroup; constructor(obj?: any) { Object.assign(this, obj); diff --git a/src/app/models/jobGroup.model.ts b/src/app/models/jobGroup.model.ts new file mode 100644 index 000000000..9c3e742fb --- /dev/null +++ b/src/app/models/jobGroup.model.ts @@ -0,0 +1,8 @@ +export class JobGroup { + _id?: string; + name: string; + + constructor(obj?: any) { + Object.assign(this, obj); + } +} diff --git a/src/app/structure-list/services/search.service.ts b/src/app/structure-list/services/search.service.ts index 78408003c..34934e8e1 100644 --- a/src/app/structure-list/services/search.service.ts +++ b/src/app/structure-list/services/search.service.ts @@ -22,9 +22,8 @@ export class SearchService { public getCategories(): Observable<Category[]> { return this.http.get('/api/categories').pipe(map((data: any[]) => data.map((item) => new Category(item)))); } - - public getJobs(): Observable<string[]> { - return this.http.get('/api/jobs').pipe(map((data: any[]) => data.map((item) => item.name))); + public getJobsGroups(): Observable<any> { + return this.http.get('/api/jobs-groups').pipe(map((data: any[]) => data.map((item) => item.name))); } public getEmployers(): Observable<string[]> { return this.http.get('/api/employer').pipe(map((data: any[]) => data.map((item) => item.name))); @@ -32,11 +31,11 @@ export class SearchService { public searchUserRegistry( searchTerm: string, page: number, - jobs?: string[], + jobsGroup?: string[], employers?: string[] ): Observable<SearchResults> { return this.http - .post<any>(`/api/userRegistry/?search=${searchTerm}`, { job: jobs, employer: employers, page: page }) + .post<any>(`/api/userRegistry/?search=${searchTerm}`, { jobsGroup: jobsGroup, employer: employers, page: page }) .pipe(); } public getUserRegistryCount(): Observable<number> { -- GitLab From 1a578bab05b4cbab2ad91c7121e0446ebf15ab56 Mon Sep 17 00:00:00 2001 From: Marlene Simondant <msimondant@grandlyon.com> Date: Tue, 23 May 2023 11:04:52 +0200 Subject: [PATCH 47/47] chore(release): 2.3.0 --- CHANGELOG.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index caf805af2..2af0e2aa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,66 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [2.3.0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v2.1.2...v2.3.0) (2023-05-23) + + +### Features + +* **accessibility:** improve criteria ([39fd110](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/39fd110f9e30abcaac88c416657ead00867162ae)) +* **admin:** faster map display ([36b240c](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/36b240c26ea2645ab175e3c913d49b4652493ac3)) +* **admin:** manage jobs groups ([d448c49](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/d448c49f899759b70b4c23724c4f4c39b04f0098)) +* **admin:** restore deleted structure ([197123f](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/197123f5698a495c1a7a34fc848a7e784ee531c2)) +* **admin:** show deleted structures ([1d34796](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/1d34796579ef7088f4eeda31785c5b562956299c)) +* display the connected user in the list of its structures ([2d8c1e4](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/2d8c1e496d634a8718c5ad46ad76efda15c0683a)) +* **newsletter:** add subscription toaster ([0f78d3b](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/0f78d3b2965afeac6a72072a27e7cb90e92a963c)) +* **Orientation:** Appointment process from a structure list ([7bc3cdd](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/7bc3cdd95d8cc266e3b91c3966a9fce78744c916)) +* **orientation:** new print layout ([7cfad1b](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/7cfad1baa15adfd5678f19a07566e8f9e9e116c0)) +* **posts&pages:** apply ghost styling ([e7d8c2f](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/e7d8c2f9c51c8d2ca6f701bd113cfe0a7312c439)) +* **progress:** animate width ([1c1d6d3](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/1c1d6d323817eb9212ecbc2ede28a2d5ad80e917)) +* publicOthers category renamed genre ([6772e74](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/6772e74518961b2b3114df691b93cc382e3fe6fd)) +* **rdv:** rdv disabled waiting for reworking ([1163760](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/1163760fd2caf39865888462ca92eb8846b67b0e)) +* **stats:** add matomo tracker + ghostAdmin link ([5443ec2](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/5443ec2f422321bd9db59514466186f8e958b3ab)) +* updated CNFS label icon ([8c70940](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/8c709400529b5fa150facd3eaee2e0859eee5cc1)) + + +### Bug Fixes + +* adjust layout height ([305cc35](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/305cc35f31b33a717579a2caf4d04c5a9e558aab)) +* **admin:** merge employers ([3723aff](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/3723aff5297b498c4649840f8f8cf93f815a0ec2)) +* **admin:** merge jobs ([d8c7a06](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/d8c7a062026ad81c915d046b80946870a6f5168a)) +* angular compilerOptions strict templates ([503b513](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/503b513f04d1f6fa913157b3f79808358b3e3ccb)) +* **annuaire:** filter modals ([bd96693](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/bd96693c109d3ddb53440d7b88418a41407fd9bc)) +* **annuaire:** filters ([53a5cde](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/53a5cde63e6391538fc7a7da76b9314da71faf8f)) +* **annuaire:** fix flash and add loader ([c8d3ba7](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/c8d3ba7c91d4c4af1b10cf73f46d8f66aa4e37ad)) +* **burgerMenu:** close menu on click on registry link ([2e29658](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/2e2965885b58aeec33b31e25c37c1e472e555098)) +* **carto:** add osm attribution ([f73e426](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/f73e426d3efe78c3b2402bdd45b1a1c21794af2d)) +* **carto:** filters display missing margins ([aefb7d6](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/aefb7d6be9bd6a8bac8fbfbc5f10ec7937b0ae28)) +* **carto:** filters display missing margins ([192ef8c](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/192ef8cec307329d86c23da5d885148e91688cfb)) +* **carto:** fix display on multiple filters drop down menus ([62e769f](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/62e769f5e4520a8f53789d0604c765857b86a6a2)) +* **carto:** loader not displayed ([32f6aa1](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/32f6aa1417e262b7d69d8b9c874fbadcdb2fba5a)) +* **carto:** marker issue when selecting filter ([cc33f9f](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/cc33f9fdae0964683bfc4abdcaee310d308e0284)) +* **carto:** more filters modal height ([ab1c642](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/ab1c6423362cce520779f2d2c62824370c0f1f39)) +* **carto:** retour QA issue 284 bug carto filters ([b841f17](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/b841f175d66217096e87a1d0bfc0121422f89706)) +* **config:** add config asset for local build ([829f5e5](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/829f5e5f6ded05c97ecb83bfe9f9373f0271ea10)) +* **deps:** update ag-grid monorepo to v29 (major) ([5361ca0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/5361ca0b003bf4c3069fa230f6d08afb12bcdbd3)) +* **edit-structure:** formatting name of members ([e7fcf1e](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/e7fcf1e28eb71d52e3bbf11b7dcad548bc59f659)) +* **header:** on mobile, profile icon didn't open menu ([71225f5](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/71225f5d17227467cdae1ec41b8a812b5f9c758b)) +* **mobile:** use safe view height ([c54aab8](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/c54aab858cdd308101bc66292692272d8377214b)) +* **newsletter:** add message for fake email ([c87ff40](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/c87ff40172f29fe2314a6a48c8b0c2d368b46a48)) +* **onboarding:** freewifi screen is not validated when using prev/next buttons ([074e8b7](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/074e8b71c3d38d9ab71b541d17c8b3397c364fa2)) +* package file version ([6527ae5](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/6527ae5505ff4cdd8ffd5c0f2880445c459ce374)) +* **pages & posts:** retour QA, fix width with some ghost elements ([acc22a6](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/acc22a6ea2c4cbb84c74f90cc04490482334740b)) +* **pwa:** move config outside assets to fix serviceworker mismatch ([445eb04](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/445eb045fca0f98b3a6b3c81fdc97dd0d9ba5948)) +* **stats:** fix empty matomo stats ([5b8282d](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/5b8282d2a168040a520748e0792d5b67206b573a)) +* **structure:** can't remove opened day bug ([24fb2b8](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/24fb2b86630d4e6b6bca4c3101e4310b1a2b4238)) +* **structure:** change labels in edition mode ([f3d2519](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/f3d25190f1291310a22904834f292b919bb1994a)) +* **structureCreation:** disable button on structure creation ([e2a71c7](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/e2a71c76cb1e9c9657f2c0c39aeface63232f48f)) +* **structure:** delete modal display and map url with id fix ([2874894](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/2874894afde38950a9ce81e1666844aae3929db4)) +* **structures:** fix display of additional informations about online procedures ([4376812](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/4376812c2ede567c5493eefd5c13f3eee9312844)) +* **structure:** the deletedAt field must not be set to have the structure visible ([04e8939](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/04e8939edfb780eeb06d204cc96c3176d7f47127)) +* typo in mistake report modal ([9bde518](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/9bde518b55a5b6f282260f512f79992211894173)) +* update old buttons ([5c655af](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/5c655afb8060ca8719d52285cf3207f861497dd8)) + ## [2.2.0](https://forge.grandlyon.com/web-et-numerique/factory/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v2.1.2...v2.2.0) (2023-03-30) diff --git a/package.json b/package.json index 19dae5ce9..2b4307335 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pamn", - "version": "2.2.0", + "version": "2.3.0", "scripts": { "ng": "ng", "start": "ng serve --configuration=local,fr --proxy-config proxy.conf.json", -- GitLab