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._ ## Tâches
### Décrivez le comportement du bug ?
### Quel serez le comportement attendu ?
### Logs et/ou screenshots
### Possible fixes
/label ~"type::bug"
...@@ -2,6 +2,65 @@ ...@@ -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. 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) ## [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: ...@@ -4,7 +4,7 @@ services:
web-app: web-app:
restart: unless-stopped restart: unless-stopped
build: . 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: volumes:
- ./dev.conf:/etc/nginx/conf.d/default.conf - ./dev.conf:/etc/nginx/conf.d/default.conf
ports: ports:
......
...@@ -29,10 +29,10 @@ server { ...@@ -29,10 +29,10 @@ server {
_paq.push(['enableLinkTracking']); _paq.push(['enableLinkTracking']);
(function() { (function() {
var u='<URL_GDLYON>'; var u='<URL_GDLYON>';
_paq.push(['setTrackerUrl', u+'piwik.php']); _paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '<SITE_ID>']); _paq.push(['setSiteId', '<SITE_ID>']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; 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>"; </script>";
......
...@@ -19,6 +19,16 @@ ...@@ -19,6 +19,16 @@
} }
], ],
"dataGroups": [ "dataGroups": [
{
"name": "documentation",
"urls": ["/doc/**"],
"cacheConfig": {
"strategy": "freshness",
"maxSize": 10000,
"maxAge": "12h",
"timeout": "5s"
}
},
{ {
"name": "ghost", "name": "ghost",
"urls": ["/blog/**"], "urls": ["/blog/**"],
......
{ {
"name": "pamn", "name": "pamn",
"version": "2.0.0-beta4", "version": "2.0.0",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
...@@ -16,6 +16,19 @@ ...@@ -16,6 +16,19 @@
"integrity": "sha512-ahLdpRAoGsdgEfy2SGV2wnnHrBSLDHuwA32v+BoNGnz1gqajr8VMzF8y6mIQt28hHi4LQ272wqSi78DK4YdT2g==", "integrity": "sha512-ahLdpRAoGsdgEfy2SGV2wnnHrBSLDHuwA32v+BoNGnz1gqajr8VMzF8y6mIQt28hHi4LQ272wqSi78DK4YdT2g==",
"dev": true "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": { "@ampproject/remapping": {
"version": "2.2.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
...@@ -21982,9 +21995,9 @@ ...@@ -21982,9 +21995,9 @@
"integrity": "sha512-Kc77HQvWO+y9y2oIs3dn5h5sy2kr3j41ewdqCMEUA4N89lgfUUfOBy7wnnHEstDpefiGFObq12FdopGRMx4J7g==" "integrity": "sha512-Kc77HQvWO+y9y2oIs3dn5h5sy2kr3j41ewdqCMEUA4N89lgfUUfOBy7wnnHEstDpefiGFObq12FdopGRMx4J7g=="
}, },
"leaflet.locatecontrol": { "leaflet.locatecontrol": {
"version": "0.77.0", "version": "0.79.0",
"resolved": "https://registry.npmjs.org/leaflet.locatecontrol/-/leaflet.locatecontrol-0.77.0.tgz", "resolved": "https://registry.npmjs.org/leaflet.locatecontrol/-/leaflet.locatecontrol-0.79.0.tgz",
"integrity": "sha512-yh2SX7Dcey7eR2zH4PXaa4WgNk0mg8hTdrVfVNTvM4/t7+IUKa122SjnL0XD2zc7gz2bQMddaMXL9142yl6mpg==" "integrity": "sha512-h64QIHFkypYdr90lkSfjKvPvvk8/b8UnP3m9WuoWdp5p2AaCWC0T1NVwyuj4rd5U4fBW3tQt4ppmZ2LceHMIDg=="
}, },
"less": { "less": {
"version": "4.1.3", "version": "4.1.3",
...@@ -25272,9 +25285,9 @@ ...@@ -25272,9 +25285,9 @@
"dev": true "dev": true
}, },
"rxjs": { "rxjs": {
"version": "7.5.7", "version": "7.6.0",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.6.0.tgz",
"integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "integrity": "sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==",
"requires": { "requires": {
"tslib": "^2.1.0" "tslib": "^2.1.0"
} }
...@@ -27842,11 +27855,11 @@ ...@@ -27842,11 +27855,11 @@
"dev": true "dev": true
}, },
"zone.js": { "zone.js": {
"version": "0.11.4", "version": "0.12.0",
"resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.12.0.tgz",
"integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", "integrity": "sha512-XtC+I5dXU14HrzidAKBNMqneIVUykLEAA1x+v4KVrd6AUPWlwYORF8KgsVqvgdHiKZ4BkxxjvYi/ksEixTPR0Q==",
"requires": { "requires": {
"tslib": "^2.0.0" "tslib": "^2.3.0"
} }
} }
} }
{ {
"name": "pamn", "name": "pamn",
"version": "2.0.0-beta4", "version": "2.0.0",
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "ng serve --configuration=fr --proxy-config proxy.conf.json", "start": "ng serve --configuration=fr --proxy-config proxy.conf.json",
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
}, },
"private": true, "private": true,
"dependencies": { "dependencies": {
"@ag-grid-community/csv-export": "^28.2.1",
"@angular/animations": "^14.2.1", "@angular/animations": "^14.2.1",
"@angular/cdk": "^14.0.0", "@angular/cdk": "^14.0.0",
"@angular/common": "^14.2.1", "@angular/common": "^14.2.1",
...@@ -33,13 +34,13 @@ ...@@ -33,13 +34,13 @@
"ag-grid-community": "^28.0.0", "ag-grid-community": "^28.0.0",
"jwt-decode": "^3.1.2", "jwt-decode": "^3.1.2",
"leaflet": "^1.9.2", "leaflet": "^1.9.2",
"leaflet.locatecontrol": "^0.77.0", "leaflet.locatecontrol": "^0.79.0",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"luxon": "^1.25.0", "luxon": "^1.25.0",
"ngx-toastr": "^15.0.0", "ngx-toastr": "^15.0.0",
"rxjs": "~7.5.0", "rxjs": "~7.6.0",
"tslib": "^2.4.0", "tslib": "^2.4.0",
"zone.js": "~0.11.4" "zone.js": "~0.12.0"
}, },
"devDependencies": { "devDependencies": {
"@angular-builders/jest": "^14.0.0", "@angular-builders/jest": "^14.0.0",
......
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { PanelComponent } from './components/panel/panel.component'; import { NgModule } from '@angular/core';
import { ClaimStructureComponent } from './components/claim-structure/claim-structure.component'; import { AgGridModule } from 'ag-grid-angular';
import { ManageUsersComponent } from './components/manage-users/manage-users.component';
import { SharedModule } from '../shared/shared.module'; 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 { AdminRoutingModule } from './admin-routing.module';
import { AgGridModule } from 'ag-grid-angular'; import { ClaimStructureComponent } from './components/claim-structure/claim-structure.component';
import { DeleteUserComponent } from './components/manage-users/delete-user/delete-user.component'; import { ManageLockdownInfoComponent } from './components/lockdown-info/manage-lockdown-info.component';
import { AdministredStructuresComponent } from './components/manage-users/administred-structures/administred-structures.component'; import { DeleteEmployerComponent } from './components/manage-employers/delete-employer/delete-employer.component';
import { ManageJobsComponent } from './components/manage-jobs/manage-jobs.component';
import { ManageEmployersComponent } from './components/manage-employers/manage-employers.component'; import { ManageEmployersComponent } from './components/manage-employers/manage-employers.component';
import { JobRenderer } from './components/manage-users/job-renderer/job-renderer.component'; import { ValidateEmployerComponent } from './components/manage-employers/validate-employer/validate-employer.component';
import { EmployerRenderer } from './components/manage-users/employer-renderer/employer-renderer.component';
import { AttachedUsersComponent } from './components/manage-jobs/attached-users/attached-users.component'; import { AttachedUsersComponent } from './components/manage-jobs/attached-users/attached-users.component';
import { DeleteJobComponent } from './components/manage-jobs/delete-job/delete-job.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 { 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({ @NgModule({
declarations: [ declarations: [
......
...@@ -3,12 +3,14 @@ ...@@ -3,12 +3,14 @@
<thead> <thead>
<th scope="col">Utilisateur</th> <th scope="col">Utilisateur</th>
<th scope="col">Structure</th> <th scope="col">Structure</th>
<th scope="col">Date de demande</th>
<th scope="col">Options</th> <th scope="col">Options</th>
</thead> </thead>
<tbody> <tbody>
<tr *ngFor="let structure of demandsAttachment"> <tr *ngFor="let structure of demandsAttachment">
<td>{{ structure.userEmail }}</td> <td>{{ structure.userEmail }}</td>
<td>{{ structure.structureName }}</td> <td>{{ structure.structureName }}</td>
<td>{{ structure.createdAt | date: 'mediumDate' }}</td>
<td> <td>
<button (click)="acceptDemand(structure)">Valider</button <button (click)="acceptDemand(structure)">Valider</button
><button (click)="refuseDemand(structure)">Refuser</button> ><button (click)="refuseDemand(structure)">Refuser</button>
......
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { NotificationService } from '../../../services/notification.service';
import { StructureAdminInfo } from '../../models/demandAttachment.model'; import { StructureAdminInfo } from '../../models/demandAttachment.model';
import { AdminService } from '../../services/admin.service'; import { AdminService } from '../../services/admin.service';
...@@ -12,7 +13,7 @@ export class ClaimStructureComponent implements OnInit { ...@@ -12,7 +13,7 @@ export class ClaimStructureComponent implements OnInit {
public structuresUnclaimed: StructureAdminInfo[]; public structuresUnclaimed: StructureAdminInfo[];
public isClaimedStructure: boolean = true; public isClaimedStructure: boolean = true;
public isUnclaimedStructure: boolean = false; public isUnclaimedStructure: boolean = false;
constructor(private adminService: AdminService) {} constructor(private adminService: AdminService, private notificationService: NotificationService) {}
ngOnInit(): void { ngOnInit(): void {
this.adminService.getPendingStructure().subscribe((demands) => { this.adminService.getPendingStructure().subscribe((demands) => {
...@@ -21,19 +22,27 @@ export class ClaimStructureComponent implements OnInit { ...@@ -21,19 +22,27 @@ export class ClaimStructureComponent implements OnInit {
} }
public acceptDemand(demand: StructureAdminInfo): void { public acceptDemand(demand: StructureAdminInfo): void {
this.adminService this.adminService.acceptStructureClaim(demand.userEmail, demand.structureId, demand.structureName).subscribe({
.acceptStructureClaim(demand.userEmail, demand.structureId, demand.structureName) next: (data) => {
.subscribe((data) => {
this.demandsAttachment = 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 { public refuseDemand(demand: StructureAdminInfo): void {
this.adminService this.adminService.refuseStructureClaim(demand.userEmail, demand.structureId, demand.structureName).subscribe({
.refuseStructureClaim(demand.userEmail, demand.structureId, demand.structureName) next: (data) => {
.subscribe((data) => {
this.demandsAttachment = 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 { public claimedStructure(_event: boolean): void {
......
<div *ngIf="isLoading" class="loader"> <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>
<div *ngIf="!isLoading" fxLayout="column" fxLayoutAlign="center center"> <div *ngIf="!isLoading" fxLayout="column" fxLayoutAlign="center center">
<H2>Gestion de l'affichage des infos Covid</H2> <H2>Gestion de l'affichage des infos Covid</H2>
......
import { Component, Input } from '@angular/core'; 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'; import { PanelRouteService } from '../../../services/panel-route.service';
@Component({ @Component({
...@@ -14,7 +14,7 @@ export class AttachedUsersComponent { ...@@ -14,7 +14,7 @@ export class AttachedUsersComponent {
constructor(private panelRouteService: PanelRouteService) {} constructor(private panelRouteService: PanelRouteService) {}
public redirectTo() { public redirectTo() {
this.panelRouteService.redirectTo(AdminPannelEnum.manageUsers); this.panelRouteService.redirectTo(AdminPanelEnum.manageUsers);
} }
public agInit(params: any): void { public agInit(params: any): void {
......
<div fxLayout="column" fxLayoutGap="5px" fxLayoutAlign="center center" class="userBlock"> <div fxLayout="column" fxLayoutGap="5px" fxLayoutAlign="center center" class="userBlock">
<h3> <h2>
Gestion des utilisateurs Gestion des utilisateurs
<span *ngIf="unVerifiedUsers && unAttachedUsers && attachedUsers"> <span *ngIf="unVerifiedUsers && unAttachedUsers && attachedUsers">
({{ unVerifiedUsers.length + unAttachedUsers.length + attachedUsers.length }}) ({{ unVerifiedUsers.length + unAttachedUsers.length + attachedUsers.length }})
</span> </span>
</h3> </h2>
</div> </div>
<div class="tables-list"> <div class="tables-list">
...@@ -24,7 +24,14 @@ ...@@ -24,7 +24,14 @@
</ag-grid-angular> </ag-grid-angular>
</div> </div>
<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 <ag-grid-angular
*ngIf="validatedJobs && validatedEmployers" *ngIf="validatedJobs && validatedEmployers"
class="ag-theme-alpine user-table" class="ag-theme-alpine user-table"
...@@ -35,11 +42,15 @@ ...@@ -35,11 +42,15 @@
[getRowHeight]="getRowHeight" [getRowHeight]="getRowHeight"
[defaultColDef]="unAttachedColDef" [defaultColDef]="unAttachedColDef"
[frameworkComponents]="frameworkComponents" [frameworkComponents]="frameworkComponents"
(gridReady)="onGridReady($event, 'unattached')"
> >
</ag-grid-angular> </ag-grid-angular>
</div> </div>
<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 <ag-grid-angular
*ngIf="validatedJobs && validatedEmployers" *ngIf="validatedJobs && validatedEmployers"
class="ag-theme-alpine user-table" class="ag-theme-alpine user-table"
...@@ -50,6 +61,7 @@ ...@@ -50,6 +61,7 @@
[getRowHeight]="getRowHeight" [getRowHeight]="getRowHeight"
[defaultColDef]="defaultColDef" [defaultColDef]="defaultColDef"
[frameworkComponents]="frameworkComponents" [frameworkComponents]="frameworkComponents"
(gridReady)="onGridReady($event, 'attached')"
> >
</ag-grid-angular> </ag-grid-angular>
</div> </div>
......
...@@ -18,3 +18,7 @@ ...@@ -18,3 +18,7 @@
app-delete-user { app-delete-user {
text-align: center; text-align: center;
} }
::ng-deep button {
margin-left: 0.5rem;
}
...@@ -8,6 +8,10 @@ import { Employer } from '../../../models/employer.model'; ...@@ -8,6 +8,10 @@ import { Employer } from '../../../models/employer.model';
import { EmployerRenderer } from './employer-renderer/employer-renderer.component'; import { EmployerRenderer } from './employer-renderer/employer-renderer.component';
import { NotificationService } from '../../../services/notification.service'; import { NotificationService } from '../../../services/notification.service';
import { DeleteUserComponent } from './delete-user/delete-user.component'; 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({ @Component({
selector: 'app-admin-manage-users', selector: 'app-admin-manage-users',
...@@ -16,7 +20,9 @@ import { DeleteUserComponent } from './delete-user/delete-user.component'; ...@@ -16,7 +20,9 @@ import { DeleteUserComponent } from './delete-user/delete-user.component';
}) })
export class ManageUsersComponent { export class ManageUsersComponent {
public attachedUsers: User[] = []; public attachedUsers: User[] = [];
public gridApiAttached: GridApi;
public unAttachedUsers: User[] = []; public unAttachedUsers: User[] = [];
public gridApiUnattached: GridApi;
public unVerifiedUsers: User[] = []; public unVerifiedUsers: User[] = [];
public validatedJobsName: string[] = []; public validatedJobsName: string[] = [];
public validatedJobs: Job[] = []; public validatedJobs: Job[] = [];
...@@ -53,6 +59,7 @@ export class ManageUsersComponent { ...@@ -53,6 +59,7 @@ export class ManageUsersComponent {
color: '#da6c2e', color: '#da6c2e',
}, },
}; };
public buttonTypeEnum = ButtonType;
constructor(private adminService: AdminService, private notificationService: NotificationService) { constructor(private adminService: AdminService, private notificationService: NotificationService) {
this.findValidatedJobs(); this.findValidatedJobs();
...@@ -293,6 +300,31 @@ export class ManageUsersComponent { ...@@ -293,6 +300,31 @@ export class ManageUsersComponent {
} }
public getRowHeight(params): number { 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="column" fxLayoutGap="20px" class="content-container full-screen">
<div fxLayout="row" fxLayoutAlign="center center"><h1>Administration</h1></div> <div fxLayout="row" fxLayoutAlign="center center"><h1>Administration</h1></div>
<div fxLayout="row" fxLayoutGap="20px" fxLayoutAlign="center center"> <div fxLayout="row" fxLayoutGap="20px" fxLayoutAlign="center center">
<button (click)="changeActiveFeature(features.pendingStructures)">Revendication structure</button> <app-button
<button (click)="changeActiveFeature(features.structuresList)">Liste structures</button> [text]="'Revendication structure'"
<button (click)="changeActiveFeature(features.manageUsers)">Gestion des utilisateurs</button> [style]="buttonTypeEnum.Secondary"
<button (click)="changeActiveFeature(features.lockdownInfo)">Gestion des infos covid</button> (click)="changeActiveFeature(features.pendingStructures)"
<button (click)="changeActiveFeature(features.jobsList)">Fonctions</button> ></app-button>
<button (click)="changeActiveFeature(features.employersList)">Employeurs</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> <a target="_blank" class="custom-link" rel="noopener noreferrer" [href]="ghostLink">Ghost</a>
</div> </div>
<div *ngIf="selectedFeature === features.structuresList"> <div *ngIf="selectedFeature === features.structuresList">
......
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { environment } from '../../../../environments/environment'; 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'; import { PanelRouteService } from '../../services/panel-route.service';
@Component({ @Component({
selector: 'app-admin-panel', selector: 'app-admin-panel',
templateUrl: './panel.component.html', templateUrl: './panel.component.html',
providers: [PanelRouteService] providers: [PanelRouteService],
}) })
export class PanelComponent implements OnInit { export class PanelComponent implements OnInit {
public features = AdminPannelEnum; public features = AdminPanelEnum;
public ghostLink = environment.ghostAdmin; public ghostLink = environment.ghostAdmin;
public selectedFeature; public selectedFeature;
public buttonTypeEnum = ButtonType;
constructor(private panelRouteService: PanelRouteService) { constructor(private panelRouteService: PanelRouteService) {
this.panelRouteService.destinationChanged$.subscribe((selected: AdminPannelEnum) => { this.panelRouteService.destinationChanged$.subscribe((selected: AdminPanelEnum) => {
this.selectedFeature = selected; this.selectedFeature = selected;
}); });
} }
...@@ -23,7 +25,7 @@ export class PanelComponent implements OnInit { ...@@ -23,7 +25,7 @@ export class PanelComponent implements OnInit {
this.selectedFeature = this.features.pendingStructures; this.selectedFeature = this.features.pendingStructures;
} }
public changeActiveFeature(newFeature: AdminPannelEnum): void { public changeActiveFeature(newFeature: AdminPanelEnum): void {
this.selectedFeature = newFeature; this.selectedFeature = newFeature;
} }
} }
...@@ -2,4 +2,5 @@ export class StructureAdminInfo { ...@@ -2,4 +2,5 @@ export class StructureAdminInfo {
userEmail: string; userEmail: string;
structureId: number; structureId: number;
structureName: string; structureName: string;
createdAt: string;
} }
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { AdminPannelEnum } from '../../shared/enum/adminPanel.enum'; import { AdminPanelEnum } from '../../shared/enum/adminPanel.enum';
@Injectable() @Injectable()
export class PanelRouteService { export class PanelRouteService {
private destination = new Subject<AdminPannelEnum>(); private destination = new Subject<AdminPanelEnum>();
destinationChanged$ = this.destination.asObservable(); destinationChanged$ = this.destination.asObservable();
redirectTo(dest: AdminPannelEnum) { redirectTo(dest: AdminPanelEnum) {
this.destination.next(dest); this.destination.next(dest);
} }
} }
<div class="content-container" [ngClass]="{ logged: userIsLoggedIn() }"> <div class="content-container no-pt" [ngClass]="{ logged: userIsLoggedIn() }">
<div *ngIf="userIsLoggedIn()"> <div *ngIf="userIsLoggedIn()">
<app-search-bar <app-search-bar
class="hide-on-print" class="hide-on-print"
......