Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • web-et-numerique/factory/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client
1 result
Show changes
Commits on Source (69)
Showing
with 239 additions and 80 deletions
/title [Scope] Description
[[_TOC_]]
### Résumé du problème
## Contexte
_Donnez une description briève du problème._
## Objectif
### Les étapes pour reproduire le bug
## Ressources
_Listez les étapes qui vous permettent de reproduire ce bug, cette étape est très importante._
### Décrivez le comportement du bug ?
### Quel serez le comportement attendu ?
### Logs et/ou screenshots
### Possible fixes
/label ~"type::bug"
## Tâches
......@@ -2,6 +2,65 @@
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.0.0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v2.0.0-beta5...v2.0.0) (2022-12-02)
### Features
* **dev:** add documentation cache config ([5dfd22c](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/5dfd22c168db1ee5b6c6c5d275984ae535f3348c))
* **onboarding:** split public in two steps ([d66d67c](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/d66d67c957c26f207bb956ff345bacbe53275d06))
* **orientation:** print orientation design ([adf8431](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/adf843161ea16c0642dce89150075a41d48f82f0))
* **profile:** add loader on member loading ([862522c](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/862522c1fed0c30c906d7be7a6793020067fcda0))
* Remove online mediation button from footer ([401b519](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/401b519c214445fee31f748707ff3f4265237fda))
### Bug Fixes
* Hide profile sections that are not implemented yet ([a38bea6](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/a38bea6f7a5ef519025fd4a4a2f1e94802618dbb))
* **orientation:** distance display when no position sharing ([b17060b](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/b17060bd5f3c969298906c549432f3187ca242a9))
* **orientation:** onlineProcedure was unnecessarily cut ([d5a29d6](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/d5a29d660cf97e4bc5712c0675bb8b20eaee7abd))
* **orientation:** typo ([e495be8](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/e495be8c03ad0941aa912693fca2d42880d36653))
* **profile:** members number display ([7858618](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/785861830fb99a5d012e340032993b059fc23974))
## [2.0.0-beta5](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v2.0.0-beta4...v2.0.0-beta5) (2022-11-23)
### Features
* Add solidarity material in onboarding + carto + edit ([1f997f2](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/1f997f2c6536d36cda8df7f0cf09d24b9d50e2d7))
* **admin:** export users ([76a3add](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/76a3add32e542f5dd49cd0824a562c98c429da13))
* **carto:** add pmr handling for carto filtering and orientation ([a5232eb](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/a5232eb2be3997a6ea04db83e2374a091b1fead3))
* center loader in carto ([ff5d016](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/ff5d0161b07e787a77d7236e35dce7b97adee101))
* delete my personal offer ([6ffbd4a](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/6ffbd4ad6158d15540266a3fe690febd25918042))
* **docker:** update registry path ([6698cf8](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/6698cf839f29e780692ff6d1e776599d57a2b5f3))
* **edit-structure:** link to manage members ([e5cc5d3](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/e5cc5d3064b2a925d77bb0c204497518eb002337))
* **footer:** "mediation numérique" button ([2be0de8](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/2be0de896264ff8c840bb7a8f34ae0d33d803b52))
* **nginx:** update matomo base conf ([8166b93](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/8166b93bdaa1e0970bf2da9855d01ed56b17d019))
* **orientation:** :hammer: add new orientation with the following tunnels : trainings, online accompaniement, solidarity material, material access ([249a6be](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/249a6be341319aff8de7766490ce2a2c30faeb57))
* **orientation:** add language selection ([05867d0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/05867d0e76ca2d4508516b96699163bc31aa8bee))
* **orientation:** Add modal for foreigners demarch ([e8419a6](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/e8419a6b768a19d40283e016fb27eb43bc438236))
* personal offer edition ([9cc07be](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/9cc07bedb7dcafe44bb55b315c2bd0f052eea52f))
* personal offers section in profile ([a2159c5](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/a2159c52384c344065d48fd5e0db824f9b3dc9f5))
* **personnalOffer:** Add-multi-checkbox ([cfe149e](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/cfe149e4a39a8e0a6478d72a83085624e516c8b1))
### Bug Fixes
* add members ([f58fede](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/f58fedeba1a4223a020597661fddd3fe1e2ff484))
* **admin:** loader style ([27584f1](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/27584f1a76e40d8606f7941197d0371e5180e66a))
* **aptic:** handling of missing fields for aptic structures ([1568706](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/1568706de0e377edff1ff930b24e0ac3fed7d2aa))
* clickable structure carto (ios) ([14a397a](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/14a397a73bcf2088e47041cf9115e02af8c2c27b))
* **deps:** update ag-grid monorepo to v28 (major) ([1d634d0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/1d634d0e5b910028f799a98b138618466ad3d11d))
* **deps:** update dependency @asymmetrik/ngx-leaflet to v14 ([3345bef](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/3345befd2f1dde6bca893b019d7b98473bdd88ac))
* **deps:** update dependency leaflet.locatecontrol to ^0.77.0 ([864de8e](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/864de8ec78d5edf2a62e09c059df605856ded221))
* **deps:** update dependency rxjs to v7 ([7875e76](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/7875e76fee5db11c615a2589416d6b23c6956e71))
* **deps:** update dependency zone.js to ~0.12.0 ([e5aad9e](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/e5aad9ed3d63cf5e9948065b4f64dfb02b43d8e0))
* onboarding structure creation missing end button ([fe0836a](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/fe0836a00a18a2a75bd176227937ebd9accd77ee))
* **orientation:** revert merge conflict from 05867d0e76ca2d4508516b96699163bc31aa8bee ([611d961](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/611d9618be298487bbbbfa54a513e32aa609fc82))
* retours review ([aae2d55](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/aae2d550bf92385125aa45d9983e4c7c9612c0b6))
* Retours review ([f904514](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/f904514b38c184cfabc140500faf4e82882d2ce0))
* **style:** add rouded class for buttons ([5ae4610](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/5ae461025e4f7d45ffd8695102dadf3a8709667b))
## [2.0.0-beta4](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v2.0.0-beta2.2...v2.0.0-beta4) (2022-10-31)
......
......@@ -4,7 +4,7 @@ services:
web-app:
restart: unless-stopped
build: .
image: registry.forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client:${TAG}
image: registry.forge.grandlyon.com/web-et-numerique/factory/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client:${TAG}
volumes:
- ./dev.conf:/etc/nginx/conf.d/default.conf
ports:
......
......@@ -29,10 +29,10 @@ server {
_paq.push(['enableLinkTracking']);
(function() {
var u='<URL_GDLYON>';
_paq.push(['setTrackerUrl', u+'piwik.php']);
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '<SITE_ID>']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.type='text/javascript'; g.async=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>";
......
......@@ -19,6 +19,16 @@
}
],
"dataGroups": [
{
"name": "documentation",
"urls": ["/doc/**"],
"cacheConfig": {
"strategy": "freshness",
"maxSize": 10000,
"maxAge": "12h",
"timeout": "5s"
}
},
{
"name": "ghost",
"urls": ["/blog/**"],
......
{
"name": "pamn",
"version": "2.0.0-beta4",
"version": "2.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
......@@ -16,6 +16,19 @@
"integrity": "sha512-ahLdpRAoGsdgEfy2SGV2wnnHrBSLDHuwA32v+BoNGnz1gqajr8VMzF8y6mIQt28hHi4LQ272wqSi78DK4YdT2g==",
"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=="
},
"@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==",
"requires": {
"@ag-grid-community/core": "~28.2.1"
}
},
"@ampproject/remapping": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
......@@ -21982,9 +21995,9 @@
"integrity": "sha512-Kc77HQvWO+y9y2oIs3dn5h5sy2kr3j41ewdqCMEUA4N89lgfUUfOBy7wnnHEstDpefiGFObq12FdopGRMx4J7g=="
},
"leaflet.locatecontrol": {
"version": "0.77.0",
"resolved": "https://registry.npmjs.org/leaflet.locatecontrol/-/leaflet.locatecontrol-0.77.0.tgz",
"integrity": "sha512-yh2SX7Dcey7eR2zH4PXaa4WgNk0mg8hTdrVfVNTvM4/t7+IUKa122SjnL0XD2zc7gz2bQMddaMXL9142yl6mpg=="
"version": "0.79.0",
"resolved": "https://registry.npmjs.org/leaflet.locatecontrol/-/leaflet.locatecontrol-0.79.0.tgz",
"integrity": "sha512-h64QIHFkypYdr90lkSfjKvPvvk8/b8UnP3m9WuoWdp5p2AaCWC0T1NVwyuj4rd5U4fBW3tQt4ppmZ2LceHMIDg=="
},
"less": {
"version": "4.1.3",
......@@ -25272,9 +25285,9 @@
"dev": true
},
"rxjs": {
"version": "7.5.7",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz",
"integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==",
"version": "7.6.0",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz",
"integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==",
"requires": {
"tslib": "^2.1.0"
}
......@@ -27842,11 +27855,11 @@
"dev": true
},
"zone.js": {
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz",
"integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==",
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.12.0.tgz",
"integrity": "sha512-XtC+I5dXU14HrzidAKBNMqneIVUykLEAA1x+v4KVrd6AUPWlwYORF8KgsVqvgdHiKZ4BkxxjvYi/ksEixTPR0Q==",
"requires": {
"tslib": "^2.0.0"
"tslib": "^2.3.0"
}
}
}
{
"name": "pamn",
"version": "2.0.0-beta4",
"version": "2.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve --configuration=fr --proxy-config proxy.conf.json",
......@@ -16,6 +16,7 @@
},
"private": true,
"dependencies": {
"@ag-grid-community/csv-export": "^28.2.1",
"@angular/animations": "^14.2.1",
"@angular/cdk": "^14.0.0",
"@angular/common": "^14.2.1",
......@@ -33,13 +34,13 @@
"ag-grid-community": "^28.0.0",
"jwt-decode": "^3.1.2",
"leaflet": "^1.9.2",
"leaflet.locatecontrol": "^0.77.0",
"leaflet.locatecontrol": "^0.79.0",
"lodash": "^4.17.21",
"luxon": "^1.25.0",
"ngx-toastr": "^15.0.0",
"rxjs": "~7.5.0",
"rxjs": "~7.6.0",
"tslib": "^2.4.0",
"zone.js": "~0.11.4"
"zone.js": "~0.12.0"
},
"devDependencies": {
"@angular-builders/jest": "^14.0.0",
......
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { PanelComponent } from './components/panel/panel.component';
import { ClaimStructureComponent } from './components/claim-structure/claim-structure.component';
import { ManageUsersComponent } from './components/manage-users/manage-users.component';
import { NgModule } from '@angular/core';
import { AgGridModule } from 'ag-grid-angular';
import { SharedModule } from '../shared/shared.module';
import { AdminStructuresListComponent } from './components/structures-list/admin-structures-list.component';
import { ManageLockdownInfoComponent } from './components/lockdown-info/manage-lockdown-info.component';
import { AdminRoutingModule } from './admin-routing.module';
import { AgGridModule } from 'ag-grid-angular';
import { DeleteUserComponent } from './components/manage-users/delete-user/delete-user.component';
import { AdministredStructuresComponent } from './components/manage-users/administred-structures/administred-structures.component';
import { ManageJobsComponent } from './components/manage-jobs/manage-jobs.component';
import { ClaimStructureComponent } from './components/claim-structure/claim-structure.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';
import { JobRenderer } from './components/manage-users/job-renderer/job-renderer.component';
import { EmployerRenderer } from './components/manage-users/employer-renderer/employer-renderer.component';
import { ValidateEmployerComponent } from './components/manage-employers/validate-employer/validate-employer.component';
import { AttachedUsersComponent } from './components/manage-jobs/attached-users/attached-users.component';
import { DeleteJobComponent } from './components/manage-jobs/delete-job/delete-job.component';
import { DeleteEmployerComponent } from './components/manage-employers/delete-employer/delete-employer.component';
import { ValidateJobComponent } from './components/manage-jobs/validate-job/validate-job.component';
import { ValidateEmployerComponent } from './components/manage-employers/validate-employer/validate-employer.component';
import { JobPersonalOffer } 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';
import { AdministredStructuresComponent } from './components/manage-users/administred-structures/administred-structures.component';
import { DeleteUserComponent } from './components/manage-users/delete-user/delete-user.component';
import { EmployerRenderer } from './components/manage-users/employer-renderer/employer-renderer.component';
import { JobRenderer } 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 { AdminStructuresListComponent } from './components/structures-list/admin-structures-list.component';
@NgModule({
declarations: [
......
......@@ -3,12 +3,14 @@
<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 (click)="acceptDemand(structure)">Valider</button
><button (click)="refuseDemand(structure)">Refuser</button>
......
import { Component, OnInit } from '@angular/core';
import { NotificationService } from '../../../services/notification.service';
import { StructureAdminInfo } from '../../models/demandAttachment.model';
import { AdminService } from '../../services/admin.service';
......@@ -12,7 +13,7 @@ export class ClaimStructureComponent implements OnInit {
public structuresUnclaimed: StructureAdminInfo[];
public isClaimedStructure: boolean = true;
public isUnclaimedStructure: boolean = false;
constructor(private adminService: AdminService) {}
constructor(private adminService: AdminService, private notificationService: NotificationService) {}
ngOnInit(): void {
this.adminService.getPendingStructure().subscribe((demands) => {
......@@ -21,19 +22,27 @@ export class ClaimStructureComponent implements OnInit {
}
public acceptDemand(demand: StructureAdminInfo): void {
this.adminService
.acceptStructureClaim(demand.userEmail, demand.structureId, demand.structureName)
.subscribe((data) => {
this.adminService.acceptStructureClaim(demand.userEmail, demand.structureId, demand.structureName).subscribe({
next: (data) => {
this.demandsAttachment = data;
});
this.notificationService.showSuccess('Demande acceptée avec succès');
},
error: (e) => {
this.notificationService.showError('Une erreur est survenue');
},
});
}
public refuseDemand(demand: StructureAdminInfo): void {
this.adminService
.refuseStructureClaim(demand.userEmail, demand.structureId, demand.structureName)
.subscribe((data) => {
this.adminService.refuseStructureClaim(demand.userEmail, demand.structureId, demand.structureName).subscribe({
next: (data) => {
this.demandsAttachment = data;
});
this.notificationService.showSuccess('Demande refusée avec succès');
},
error: (e) => {
this.notificationService.showError('Une erreur est survenue');
},
});
}
public claimedStructure(_event: boolean): void {
......
<div *ngIf="isLoading" class="loader">
<img class="loader-gif" src="/assets/gif/loader_circle.gif" alt />
<img class="loader-gif" src="/assets/gif/loader_circle_grey.gif" alt />
</div>
<div *ngIf="!isLoading" fxLayout="column" fxLayoutAlign="center center">
<H2>Gestion de l'affichage des infos Covid</H2>
......
import { Component, Input } from '@angular/core';
import { AdminPannelEnum } from '../../../../shared/enum/adminPanel.enum';
import { AdminPanelEnum } from '../../../../shared/enum/adminPanel.enum';
import { PanelRouteService } from '../../../services/panel-route.service';
@Component({
......@@ -14,7 +14,7 @@ export class AttachedUsersComponent {
constructor(private panelRouteService: PanelRouteService) {}
public redirectTo() {
this.panelRouteService.redirectTo(AdminPannelEnum.manageUsers);
this.panelRouteService.redirectTo(AdminPanelEnum.manageUsers);
}
public agInit(params: any): void {
......
<div fxLayout="column" fxLayoutGap="5px" fxLayoutAlign="center center" class="userBlock">
<h3>
<h2>
Gestion des utilisateurs
<span *ngIf="unVerifiedUsers && unAttachedUsers && attachedUsers">
({{ unVerifiedUsers.length + unAttachedUsers.length + attachedUsers.length }})
</span>
</h3>
</h2>
</div>
<div class="tables-list">
......@@ -24,7 +24,14 @@
</ag-grid-angular>
</div>
<div>
<h3 class="title" *ngIf="unAttachedUsers">Utilisateurs non rattachés ({{ unAttachedUsers.length }})</h3>
<h3 class="title" *ngIf="unAttachedUsers">
Utilisateurs non rattachés ({{ unAttachedUsers.length }})
<app-button
[text]="'Exporter'"
[style]="buttonTypeEnum.Tertiary"
(click)="exportUsers('unattached')"
></app-button>
</h3>
<ag-grid-angular
*ngIf="validatedJobs && validatedEmployers"
class="ag-theme-alpine user-table"
......@@ -35,11 +42,15 @@
[getRowHeight]="getRowHeight"
[defaultColDef]="unAttachedColDef"
[frameworkComponents]="frameworkComponents"
(gridReady)="onGridReady($event, 'unattached')"
>
</ag-grid-angular>
</div>
<div>
<h3 class="title" *ngIf="attachedUsers">Utilisateurs rattachés ({{ attachedUsers.length }})</h3>
<h3 class="title" *ngIf="attachedUsers">
Utilisateurs rattachés ({{ attachedUsers.length }})
<app-button [text]="'Exporter'" [style]="buttonTypeEnum.Tertiary" (click)="exportUsers('attached')"></app-button>
</h3>
<ag-grid-angular
*ngIf="validatedJobs && validatedEmployers"
class="ag-theme-alpine user-table"
......@@ -50,6 +61,7 @@
[getRowHeight]="getRowHeight"
[defaultColDef]="defaultColDef"
[frameworkComponents]="frameworkComponents"
(gridReady)="onGridReady($event, 'attached')"
>
</ag-grid-angular>
</div>
......
......@@ -18,3 +18,7 @@
app-delete-user {
text-align: center;
}
::ng-deep button {
margin-left: 0.5rem;
}
......@@ -8,6 +8,10 @@ import { Employer } from '../../../models/employer.model';
import { EmployerRenderer } from './employer-renderer/employer-renderer.component';
import { NotificationService } from '../../../services/notification.service';
import { DeleteUserComponent } from './delete-user/delete-user.component';
import { CsvExportParams, GridApi, GridReadyEvent } from 'ag-grid-community';
import { ButtonType } from '../../../shared/components/button/buttonType.enum';
type UsersStatus = 'attached' | 'unattached';
@Component({
selector: 'app-admin-manage-users',
......@@ -16,7 +20,9 @@ import { DeleteUserComponent } from './delete-user/delete-user.component';
})
export class ManageUsersComponent {
public attachedUsers: User[] = [];
public gridApiAttached: GridApi;
public unAttachedUsers: User[] = [];
public gridApiUnattached: GridApi;
public unVerifiedUsers: User[] = [];
public validatedJobsName: string[] = [];
public validatedJobs: Job[] = [];
......@@ -53,6 +59,7 @@ export class ManageUsersComponent {
color: '#da6c2e',
},
};
public buttonTypeEnum = ButtonType;
constructor(private adminService: AdminService, private notificationService: NotificationService) {
this.findValidatedJobs();
......@@ -293,6 +300,31 @@ export class ManageUsersComponent {
}
public getRowHeight(params): number {
return params.data.structures ? (params.data.structures.length != 0 ? params.data.structures.length * 40 : 40) : 40;
return params.data.structures?.length * 40 || 40;
}
public onGridReady(params: GridReadyEvent, status: UsersStatus): void {
if (status === 'attached') {
this.gridApiAttached = params.api;
} else if (status === 'unattached') {
this.gridApiUnattached = params.api;
}
}
public exportUsers(status: UsersStatus): void {
const exportParams: CsvExportParams = {
columnKeys: ['name', 'surname', 'email'],
};
if (status === 'attached') {
this.gridApiAttached.exportDataAsCsv({
...exportParams,
fileName: 'RESIN - export utilisateurs rattachés',
});
} else if (status === 'unattached') {
this.gridApiUnattached.exportDataAsCsv({
...exportParams,
fileName: 'RESIN - export utilisateurs non rattachés',
});
}
}
}
<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">
<button (click)="changeActiveFeature(features.pendingStructures)">Revendication structure</button>
<button (click)="changeActiveFeature(features.structuresList)">Liste structures</button>
<button (click)="changeActiveFeature(features.manageUsers)">Gestion des utilisateurs</button>
<button (click)="changeActiveFeature(features.lockdownInfo)">Gestion des infos covid</button>
<button (click)="changeActiveFeature(features.jobsList)">Fonctions</button>
<button (click)="changeActiveFeature(features.employersList)">Employeurs</button>
<app-button
[text]="'Revendication structure'"
[style]="buttonTypeEnum.Secondary"
(click)="changeActiveFeature(features.pendingStructures)"
></app-button>
<app-button
[text]="'Liste structures'"
[style]="buttonTypeEnum.Secondary"
(click)="changeActiveFeature(features.structuresList)"
></app-button>
<app-button
[text]="'Gestion des utilisateurs'"
[style]="buttonTypeEnum.Secondary"
(click)="changeActiveFeature(features.manageUsers)"
></app-button>
<app-button
[text]="'Infos covid'"
[style]="buttonTypeEnum.Secondary"
(click)="changeActiveFeature(features.lockdownInfo)"
></app-button>
<app-button
[text]="'Fonctions'"
[style]="buttonTypeEnum.Secondary"
(click)="changeActiveFeature(features.jobsList)"
></app-button>
<app-button
[text]="'Employeurs'"
[style]="buttonTypeEnum.Secondary"
(click)="changeActiveFeature(features.employersList)"
></app-button>
<a target="_blank" class="custom-link" rel="noopener noreferrer" [href]="ghostLink">Ghost</a>
</div>
<div *ngIf="selectedFeature === features.structuresList">
......
import { Component, OnInit } from '@angular/core';
import { environment } from '../../../../environments/environment';
import { AdminPannelEnum } from '../../../shared/enum/adminPanel.enum';
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]
providers: [PanelRouteService],
})
export class PanelComponent implements OnInit {
public features = AdminPannelEnum;
public features = AdminPanelEnum;
public ghostLink = environment.ghostAdmin;
public selectedFeature;
public buttonTypeEnum = ButtonType;
constructor(private panelRouteService: PanelRouteService) {
this.panelRouteService.destinationChanged$.subscribe((selected: AdminPannelEnum) => {
this.panelRouteService.destinationChanged$.subscribe((selected: AdminPanelEnum) => {
this.selectedFeature = selected;
});
}
......@@ -23,7 +25,7 @@ export class PanelComponent implements OnInit {
this.selectedFeature = this.features.pendingStructures;
}
public changeActiveFeature(newFeature: AdminPannelEnum): void {
public changeActiveFeature(newFeature: AdminPanelEnum): void {
this.selectedFeature = newFeature;
}
}
......@@ -2,4 +2,5 @@ export class StructureAdminInfo {
userEmail: string;
structureId: number;
structureName: string;
createdAt: string;
}
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { AdminPannelEnum } from '../../shared/enum/adminPanel.enum';
import { AdminPanelEnum } from '../../shared/enum/adminPanel.enum';
@Injectable()
export class PanelRouteService {
private destination = new Subject<AdminPannelEnum>();
private destination = new Subject<AdminPanelEnum>();
destinationChanged$ = this.destination.asObservable();
redirectTo(dest: AdminPannelEnum) {
redirectTo(dest: AdminPanelEnum) {
this.destination.next(dest);
}
}
<div class="content-container" [ngClass]="{ logged: userIsLoggedIn() }">
<div class="content-container no-pt" [ngClass]="{ logged: userIsLoggedIn() }">
<div *ngIf="userIsLoggedIn()">
<app-search-bar
class="hide-on-print"
......