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 (23)
Showing
with 251 additions and 74 deletions
......@@ -2,6 +2,29 @@
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.
## [1.12.0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v1.11.1...v1.12.0) (2022-02-01)
### Features
* **contact:** Add a contact form ([ecfa689](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/ecfa68943176727234e531d58e556bb9283ff54a))
* **news:** redesign of news page, filter system on tag as 'Allophone'... is now disabled for display. ([de858d8](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/de858d864cc79ff6ca160c5bb6def2490b6a5003))
* **structure:** change addresse api in order to cover the all department. Filtering duplicated addresses in order to dispaly one occurence for user. Brignais is now removed from carto. ([17e97fd](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/17e97fdb4571ffa2dfb55f59e761a12ac00e2299))
* **stucture-details:** sticky close button and structure name ([6ddb95d](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/6ddb95d2a4e491b17b7c2641cf8be07e7c8b6e79))
* **user-management:** add table with all users in admin user management page ([461fed5](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/461fed507396b5d988faae9bd0e3171633197e2e))
* **version:** Display app version ([3c5f554](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/3c5f554b0a00de8e2dfef0cb76b76ed30d090036))
### Bug Fixes
* better handling of scroll reset inside the app in case of navigation ([560955b](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/560955bb189a879e0095f9e3cb0e6d7a1d21fd4e))
* **heder:** logo position was not centered perfectly ([391e4d4](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/391e4d4e7108306be1b62dab46a05eb10b26eba8))
* **news:** clean code and remove unecesary api call for 'a-la-une' tag ([5ada347](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/5ada347d12c24339a1fa1ee4d2da2a30eeb5c4bf))
* **news:** fix scroll issue and css display on mobile ([7a2fa9a](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/7a2fa9aa8c9ff65d9770a554434bd607ec8af321))
* set missing validation form on phone input ([95ffed1](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/95ffed17fd618e963fa037e80d2f2e59c7c0748f))
* **structure-list:** border-bottom is now correctly removed on last element ([1f5a501](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/1f5a50128b1f8521a85c302468783a45c51f2b03))
* **style:** header display on mobile. Logo is now properly centered ([667288f](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/667288fd4d58e58fa97aba86f68dd4324df01d51))
### [1.11.1](https://forge.grandlyon.com///compare/v1.11.0...v1.11.1) (2022-01-31)
......
......@@ -30,7 +30,7 @@ module.exports = function (config) {
target: 'https://passerelle.formulaireextranet.grandlyon.com',
changeOrigin: true,
},
'/geocoding/photon-bal/api': {
'/geocoding/photon/api': {
target: 'https://download.data.grandlyon.com',
changeOrigin: true,
},
......
......@@ -52,8 +52,8 @@ server {
proxy_pass https://passerelle.formulaireextranet.grandlyon.com/base-adresse/base-adresse-nationale/streets;
}
location /geocoding/photon-bal/api {
proxy_pass https://download.data.grandlyon.com/geocoding/photon-bal/api;
location /geocoding/photon/api {
proxy_pass https://download.data.grandlyon.com/geocoding/photon/api;
}
location /reverse {
......
{
"name": "pamn",
"version": "1.11.1",
"version": "1.12.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
......@@ -3412,6 +3412,31 @@
"integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
"dev": true
},
"ag-grid-angular": {
"version": "26.2.0",
"resolved": "https://registry.npmjs.org/ag-grid-angular/-/ag-grid-angular-26.2.0.tgz",
"integrity": "sha512-IJYNniJkQXQhEMdsZ50MFMY80K3PQGsh4Jh1Nu7G1Det5Pq2QNPgZ/FwNucsxYDPn32VICVVlUEQTwtEl63FZQ==",
"requires": {
"tslib": "^1.10.0"
},
"dependencies": {
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
}
}
},
"ag-grid-community": {
"version": "26.2.1",
"resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-26.2.1.tgz",
"integrity": "sha512-aChSGNdPkBda4BhOUUEAmAkRlIG7rFU8UTXx3NPStavrCOHKLDRV90djIKuiXfM6ONBqKmeqw2as0yuLnSN8dw=="
},
"ag-grid-enterprise": {
"version": "26.2.1",
"resolved": "https://registry.npmjs.org/ag-grid-enterprise/-/ag-grid-enterprise-26.2.1.tgz",
"integrity": "sha512-DSf+PPRHv9JXhWTg7KSEm9+ixYAEPuo3LKBUzowUCQWvygGiWBrZXEB67MnjW+Z9zULeFhU4Z6OuHbnQUDhCag=="
},
"agent-base": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
......@@ -12046,6 +12071,14 @@
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
"dev": true
},
"ngx-toastr": {
"version": "13.2.1",
"resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-13.2.1.tgz",
"integrity": "sha512-UAzp7/xWK9IXA2LsOmhpaaIGCqscvJokoQpBNpAMrjEkDeSlFf8PWQAuQY795KW0mJb3qF9UG/s23nsXfMYKmg==",
"requires": {
"tslib": "^2.0.0"
}
},
"nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
......
{
"name": "pamn",
"version": "1.11.1",
"version": "1.12.0",
"scripts": {
"ng": "ng",
"start": "ng serve --configuration=fr --proxy-config proxy.conf.json",
......@@ -29,12 +29,16 @@
"@angular/router": "~11.2.12",
"@asymmetrik/ngx-leaflet": "^8.1.0",
"@ngx-translate/core": "^13.0.0",
"ag-grid-angular": "^26.2.0",
"ag-grid-community": "^26.2.1",
"ag-grid-enterprise": "^26.2.1",
"json-server": "^0.16.2",
"jwt-decode": "^3.1.2",
"leaflet": "^1.7.1",
"leaflet.locatecontrol": "^0.72.0",
"lodash": "^4.17.20",
"luxon": "^1.25.0",
"ngx-toastr": "^13.2.1",
"npx": "^10.2.2",
"rxjs": "~6.6.0",
"tslib": "^2.0.0",
......
......@@ -26,7 +26,7 @@
"changeOrigin": true,
"logLevel": "info"
},
"/geocoding/photon-bal/api": {
"/geocoding/photon/api": {
"target": "https://download.data.grandlyon.com",
"secure": false,
"changeOrigin": true,
......
......@@ -27,6 +27,7 @@
acteurs.
</p>
<p>N'hésitez pas à contribuer à cet espace en partageant vos ressources</p>
<p class="version" fxLayoutAlign="center center">Version : {{ version }}</p>
</div>
<div fxLayout="column" fxLayoutAlign="center center" fxLayoutGap="20px">
<img src="/assets/logos/logo_europe.png" width="220" height="168" alt="logo de l'union européenne" />
......
......@@ -13,3 +13,9 @@ h2 {
.about-container {
max-width: 760px;
}
.version {
padding-top: 80px;
font-size: $font-size-xxsmall;
color: $grey-3;
}
import { Component, OnInit } from '@angular/core';
import { version } from '../../../package.json';
@Component({
selector: 'app-about',
templateUrl: './about.component.html',
styleUrls: ['./about.component.scss']
styleUrls: ['./about.component.scss'],
})
export class AboutComponent implements OnInit {
public version: string = version;
constructor() { }
ngOnInit(): void {
}
constructor() {}
ngOnInit(): void {}
}
......@@ -2,14 +2,30 @@ 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 { DeleteUserComponent } from './components/delete-user/delete-user.component';
import { ManageUsersComponent } from './components/manage-users/manage-users.component';
import { SharedModule } from '../shared/shared.module';
import { NewsletterUsersComponent } from './components/newsletter-users/newsletter-users.component';
import { AdminStructuresListComponent } from './components/structures-list/admin-structures-list.component';
import { 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';
@NgModule({
declarations: [PanelComponent, ClaimStructureComponent, DeleteUserComponent, NewsletterUsersComponent, AdminStructuresListComponent],
imports: [CommonModule, AdminRoutingModule, SharedModule],
declarations: [
PanelComponent,
ClaimStructureComponent,
NewsletterUsersComponent,
AdminStructuresListComponent,
ManageUsersComponent,
DeleteUserComponent,
AdministredStructuresComponent,
],
imports: [
CommonModule,
AdminRoutingModule,
SharedModule,
AgGridModule.withComponents([DeleteUserComponent, AdministredStructuresComponent]),
],
})
export class AdminModule {}
<div fxLayout="column" fxLayoutGap="5px" fxLayoutAlign="center center" class="userBlock">
<h4>Suppression d'utilisateurs</h4>
<div fxLayout="row">
<input #searchstring (keyup)="(0)" />
<button (click)="searchUsers(searchstring.value)">Rechercher</button>
</div>
<div class="userList">
<tr *ngFor="let user of users">
<td>{{ user.email }}</td>
<td>
<button (click)="toggleDeleteModal(user)">Supprimer</button>
</td>
</tr>
<app-modal-confirmation
*ngIf="userToDelete"
[openned]="deleteModalOpenned"
[content]="'Voulez-vous vraiment supprimer cet utilisateur&nbsp;? (' + userToDelete.email + ')'"
(closed)="deleteUser(userToDelete, $event)"
></app-modal-confirmation>
<div *ngIf="users && users.length == 0">Aucun résultat</div>
</div>
</div>
import { Component } from '@angular/core';
import { User } from '../../../models/user.model';
import { ProfileService } from '../../../profile/services/profile.service';
import { AdminService } from '../../services/admin.service';
@Component({
selector: 'app-admin-delete-user',
templateUrl: './delete-user.component.html',
})
export class DeleteUserComponent {
public users: User[];
public deleteModalOpenned = false;
public userToDelete: User = null;
constructor(private adminService: AdminService, private profileService: ProfileService) {}
public deleteUser(user: User, shouldDelete: boolean): void {
this.toggleDeleteModal(user);
if (shouldDelete) {
this.adminService.deleteUser(user._id).subscribe((data) => {
this.users = this.users.filter((obj) => obj.email !== data.email);
});
}
}
public toggleDeleteModal(userToDelete: User): void {
this.userToDelete = userToDelete;
this.deleteModalOpenned = !this.deleteModalOpenned;
}
public searchUsers(searchString: string): void {
this.adminService.searchUsers(searchString).subscribe((users) => {
this.profileService.getProfile().then((profile) => {
this.users = users.filter((obj) => obj.email != profile.email);
});
});
}
}
<div id="structure-list" *ngIf="structures.data.structures && structures.data.structures.length != 0">
<p *ngFor="let structure of structures.data.structures">
<a href="/acteurs?id={{ structure._id }}" target="_blank">{{ structure.structureName }}</a>
</p>
</div>
p {
margin-top: 0px;
margin-bottom: 0px;
}
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AdministredStructuresComponent } from './administred-structures.component';
describe('AdministredStructuresComponent', () => {
let component: AdministredStructuresComponent;
let fixture: ComponentFixture<AdministredStructuresComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ AdministredStructuresComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(AdministredStructuresComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component } from '@angular/core';
@Component({
selector: 'app-administred-structures',
templateUrl: './administred-structures.component.html',
styleUrls: ['./administred-structures.component.scss'],
})
export class AdministredStructuresComponent {
public structures: any;
public agInit(params: any): void {
this.structures = params;
}
}
<button type="button" (click)="onClick()">{{ label }}</button>
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DeleteUserComponent } from './delete-user.component';
describe('DeleteUserComponent', () => {
let component: DeleteUserComponent;
let fixture: ComponentFixture<DeleteUserComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ DeleteUserComponent ]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(DeleteUserComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component } from '@angular/core';
@Component({
selector: 'app-delete-user',
templateUrl: './delete-user.component.html',
})
export class DeleteUserComponent {
public params: any;
public label: string;
public agInit(params: any): void {
this.params = params;
this.label = this.params.label || null;
}
public onClick(): void {
if (this.params.onClick instanceof Function) {
this.params.onClick(this.params);
}
}
}
<div fxLayout="column" fxLayoutGap="5px" fxLayoutAlign="center center" class="userBlock">
<h3>
Gestion des utilisateurs
<span *ngIf="unVerifiedUsers && unAttachedUsers && attachedUsers">
({{ unVerifiedUsers.length + unAttachedUsers.length + attachedUsers.length }})
</span>
</h3>
</div>
<div class="tables-list">
<div>
<h3 class="title" *ngIf="unVerifiedUsers">Utilisateurs non vérifiés ({{ unVerifiedUsers.length }})</h3>
<ag-grid-angular
class="ag-theme-alpine user-table"
[rowData]="unVerifiedUsers"
[columnDefs]="columnDefs"
rowSelection="multiple"
domLayout="autoHeight"
[getRowHeight]="getRowHeight"
[defaultColDef]="unAttachedColDef"
[frameworkComponents]="frameworkComponents"
>
</ag-grid-angular>
</div>
<div>
<h3 class="title" *ngIf="unAttachedUsers">Utilisateurs non rattachés ({{ unAttachedUsers.length }})</h3>
<ag-grid-angular
class="ag-theme-alpine user-table"
[rowData]="unAttachedUsers"
[columnDefs]="columnDefs"
rowSelection="multiple"
domLayout="autoHeight"
[getRowHeight]="getRowHeight"
[defaultColDef]="unAttachedColDef"
[frameworkComponents]="frameworkComponents"
>
</ag-grid-angular>
</div>
<div>
<h3 class="title" *ngIf="attachedUsers">Utilisateurs rattachés ({{ attachedUsers.length }})</h3>
<ag-grid-angular
class="ag-theme-alpine user-table"
[rowData]="attachedUsers"
[columnDefs]="columnDefs"
rowSelection="multiple"
domLayout="autoHeight"
[getRowHeight]="getRowHeight"
[defaultColDef]="defaultColDef"
[frameworkComponents]="frameworkComponents"
>
</ag-grid-angular>
</div>
</div>
<app-modal-confirmation
*ngIf="userToDelete"
[openned]="deleteModalOpenned"
[content]="'Voulez-vous vraiment supprimer cet utilisateur&nbsp;? (' + userToDelete.email + ')'"
(closed)="deleteUser(userToDelete, $event)"
></app-modal-confirmation>