Commit 40af725e authored by Etienne LOUPIAS's avatar Etienne LOUPIAS
Browse files

Merge branch 'feat/US17-posts-pagination' of...

Merge branch 'feat/US17-posts-pagination' of https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client into feat/US17-posts-pagination
parents 6a7d3190 9dccd304
Pipeline #23381 passed with stage
in 10 minutes and 25 seconds
......@@ -102,7 +102,6 @@ deploy_rec:
environment:
name: rec
url: https://resin-rec.grandlyon.com
# code_analysis:
# image: skilldlabs/sonar-scanner:3.4.0
# services:
......@@ -124,15 +123,15 @@ deploy_rec:
# -Dsonar.projectKey=${SONAR_PROJECT_KEY}
# -Dsonar.login=${SONAR_TOKEN}
mr:
variables:
DOCKER_TLS_CERTDIR: ''
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09
stage: build
only:
- merge_requests
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build --pull -t "$CI_REGISTRY_IMAGE:dev" --build-arg conf=dev .
# mr:
# variables:
# DOCKER_TLS_CERTDIR: ''
# DOCKER_HOST: tcp://docker:2375/
# DOCKER_DRIVER: overlay2
# image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09
# stage: build
# only:
# - merge_requests
# script:
# - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
# - docker build --pull -t "$CI_REGISTRY_IMAGE:dev" --build-arg conf=dev .
......@@ -2,6 +2,32 @@
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.16.0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v1.15.0...v1.16.0) (2022-03-18)
### Bug Fixes
* **carto:** issue [#11](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/issues/11) responsive structure details ([ad5e3bf](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/ad5e3bf7e824c5e0cde1cafa1019035a51aecb07))
* **carto:** issue on category name after migration ([41f6d76](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/41f6d76839755d8e0d725ccb1e0fa6eb84258071))
* **carto:** maker not setting in some case ([a13de9a](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/a13de9a2d184fac6569564a4953b5aeb6a100b04))
* **pwa:** add icon for ios ([e18c936](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/e18c93606c14a41ba0da4a407d7ec94c492f8089))
* **structure-details:** display workshops again in structure details ([897a215](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/897a215b2bada359b8ee587902a8a313e7960829))
* **structures:** Impossible de rentrer des adresses sans numéro ([4d79383](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/4d79383c2703396c9fa0c48bebed8b40ee1543c0))
## [1.15.0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v1.14.0...v1.15.0) (2022-03-08)
### Features
* **data-consent:** add data sharing consent when creating and editing a structure and at log-in if no consent was ever registered for at least one of the user's structures ([4214766](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/42147665ecc287079acc03c169708b87daedcd2d))
### Bug Fixes
* **orientation-form:** set progression to 100 when clicking print ([e52fbf5](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/e52fbf5657b0a41d638f153bd6af708ec9f5cd60))
* **posts:** load more posts with tag ([a003d05](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/a003d055cf594db61cdf4ca773194bd913aa4159))
* typo and labels ([916739f](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/916739f91d9fb14334278a44a953a7bcdf1f575b))
## [1.14.0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v1.13.0...v1.14.0) (2022-02-21)
......
{
"name": "pamn",
"version": "1.14.0",
"version": "1.16.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
......
{
"name": "pamn",
"version": "1.14.0",
"version": "1.16.0",
"scripts": {
"ng": "ng",
"start": "ng serve --configuration=fr --proxy-config proxy.conf.json",
......
......@@ -102,7 +102,6 @@ const routes: Routes = [
path: 'newsletter',
component: NewsletterSubscriptionComponent,
},
{
path: 'newsletter-unsubscribe',
component: NewsletterSubscriptionComponent,
......
......@@ -45,6 +45,7 @@ import { environment } from '../environments/environment';
import { StructureResolver } from './resolvers/structure.resolver';
import { RoleGuard } from './guards/role.guard';
import { UpdateService } from './services/update.service';
import { DataShareConsentComponent } from './shared/components/data-share-consent/data-share-consent.component';
@NgModule({
declarations: [
......@@ -72,6 +73,7 @@ import { UpdateService } from './services/update.service';
StructureDetailPrintComponent,
StructureListPrintComponent,
StructurePrintHeaderComponent,
DataShareConsentComponent,
OrientationComponent,
],
imports: [
......
......@@ -39,7 +39,7 @@
<!-- Opening Hours -->
<div fxLayout="row" class="w-100 mobile-column">
<div *ngIf="structure.hours.hasData()" fxFlex="50%">
<h3 class="subtitle">Horaires d’ouverture au public</h3>
<h3 class="subtitle">Horaires</h3>
<div fxLayout="column">
<div *ngFor="let day of structure.hours | keyvalue: keepOriginalOrder">
<div *ngIf="day.value.open">
......@@ -60,7 +60,7 @@
</div>
<!-- accessModality -->
<div *ngIf="structure.accessModality.length > 0" fxFlex="40%">
<h3 class="subtitle">Accès transports en commun</h3>
<h3 class="subtitle">Accès</h3>
<div fxLayout="column">
<div *ngFor="let tclStop of tclStopPoints">
<div fxLayout="row wrap" fxLayoutGap="5px">
......
......@@ -293,7 +293,7 @@
<!-- ADDRESS SEARCH -->
<div *ngIf="currentPage == pageTypeEnum.beneficiaryAddress" class="page">
<div class="title">
<h3>Autour de quelle adresse chercher une structure ?</h3>
<h3>Autour de quelle adresse cherchez-vous une structure ?</h3>
<p class="notRequired lg">facultatif</p>
</div>
<div class="form-group" fxLayout="column">
......
......@@ -85,7 +85,7 @@
<div class="summary" *ngFor="let page of pagesValidation; let index = index">
<div
class="itemSummary"
[ngClass]="{ last: index == 22 }"
[ngClass]="{ last: index == lastPage }"
fxLayout="row"
fxLayoutAlign="space-between center"
*ngIf="page.name && shouldDisplayPage(index)"
......@@ -408,7 +408,7 @@
>
<div *ngIf="currentPage == pageTypeEnum.structureNameAndAddress" class="page">
<div class="title">
<h3>Quelle structure voulez-vous réferencer ?</h3>
<h3>Quelle structure voulez-vous référencer ?</h3>
</div>
<p
class="missing-information"
......@@ -1285,49 +1285,88 @@
</div>
</div>
</form>
<div *ngIf="currentPage == pageTypeEnum.cgu" class="page">
<div class="section">
<div class="title">
<h3>
Acceptez-vous que les informations saisies soient enregistrées par la Métropole de Lyon<span
class="asterisk"
>*</span
<form>
<div *ngIf="currentPage == pageTypeEnum.cgu" class="page">
<div class="section" *ngIf="!isEditMode">
<div class="title">
<h3>
Acceptez-vous que les informations saisies soient enregistrées par la Métropole de Lyon<span
class="asterisk"
>*</span
>
?
</h3>
</div>
<app-checkbox-form
[isChecked]="userAcceptSavedDate"
[text]="'J\'accepte'"
(checkEvent)="acceptDataBeSaved($event)"
>
</app-checkbox-form>
</div>
<div class="section">
<div class="title">
<h3>
Acceptez-vous que les informations de votre structure soient mises à disposition sur la plateforme
data.grandlyon.com<span class="asterisk" *ngIf="!isEditMode">**</span
><span class="asterisk" *ngIf="isEditMode">*</span> ?
</h3>
<p class="notRequired" *ngIf="!isEditMode">facultatif</p>
</div>
<app-checkbox-form
*ngIf="!isEditMode"
[text]="'J\'accepte'"
(checkEvent)="acceptOpenData($event)"
></app-checkbox-form>
<div class="dataShareConsent">
<app-radio-form
*ngIf="isEditMode"
name="{{ getStructureControl('structureName').value }}"
horizontal="true"
[selectedOption]="getStructureControl('dataShareConsentDate').value === null ? false : true"
(selectedEvent)="onRadioBtnChange('dataShareConsentDate', $event)"
>
?
</h3>
</app-radio-form>
</div>
</div>
<app-checkbox-form
[isChecked]="userAcceptSavedDate"
[text]="'J\'accepte'"
(checkEvent)="acceptDataBeSaved($event)"
>
</app-checkbox-form>
</div>
<div *ngIf="!profile">
<div class="title">
<h3>Acceptez-vous de recevoir des mails d'informations de la part de Res'in ?</h3>
<div *ngIf="!profile">
<div class="title">
<h3>Souhaitez-vous vous abonner à la lettre d’information de Res'in ?</h3>
<p class="notRequired" *ngIf="!isEditMode">facultatif</p>
</div>
<app-checkbox-form
[isChecked]="userAcceptNewsletter"
[text]="'J\'accepte'"
(checkEvent)="acceptReceiveNewsletter($event)"
>
</app-checkbox-form>
</div>
<p *ngIf="!isEditMode" class="informationEndForm">
<span class="asterisk">*</span> Les informations recueillies sont enregistrées dans un fichier par la
Métropole de Lyon en vue de l'animation du réseau des acteurs de la médiation numérique. Elles sont conservées
pendant 24 mois et sont destinées aux seuls intervenants habilités de la Métropole de Lyon. Vos données
personnelles sont traitées dans ce cadre aux fins de recensement des actions de médiation numérique sur le
territoire de la métropole. Conformément à la loi 78-17 du 6 janvier 1978 modifiée relative à l'information,
aux fichiers et aux libertés, et au Règlement Général européen à la Protection des Données, vous avez la
possibilité d’exercer vos droits d’accès, de rectification, d’effacement, d’opposition, de limitation du
traitement et de révocation de votre consentement. Afin d'exercer vos droits, vous pouvez vous adresser : par
courrier postal à : Métropole de Lyon - Direction des Affaires Juridiques et de la Commande Publique - 20, rue
du Lac - BP 33569 - 69505 Lyon Cedex par courrier électronique en remplissant le formulaire dédié sur Toodego,
le site des services et démarches en ligne dans la Métropole de Lyon
</p>
<div class="page" *ngIf="currentPage == pageTypeEnum.cgu">
<p class="informationEndForm">
<span class="asterisk" *ngIf="!isEditMode">**</span><span class="asterisk" *ngIf="isEditMode">*</span> La
Métropole de Lyon, engagée pour la transparence de l’action publique et la valorisation de ses partenaires,
encourage l’ouverture des données. Les données de votre structure seront publiées sur la plateforme
<a href="https://data.grandlyon.com/" target="_blank">https://data.grandlyon.com/</a> sous la licence
ouverte (open data) et seront donc librement accessibles et réutilisables. Vous pourrez modifier votre choix
à tout moment, exercer vos droits d’accès et de modification, en le signifiant, par tout moyen à votre
convenance, auprès de vos interlocuteurs de la Métropole de Lyon.
</p>
</div>
<app-checkbox-form
[isChecked]="userAcceptNewsletter"
[text]="'J\'accepte'"
(checkEvent)="acceptReceiveNewsletter($event)"
>
</app-checkbox-form>
</div>
<p class="informationEndForm">
<span class="asterisk">*</span> Les informations recueillies sont enregistrées dans un fichier par la Métropole
de Lyon en vue de l'animation du réseau des acteurs de la médiation numérique. Elles sont conservées pendant 24
mois et sont destinées aux seuls intervenants habilités de la Métropole de Lyon. Vos données personnelles sont
traitées dans ce cadre aux fins de recensement des actions de médiation numérique sur le territoire de la
métropole. Conformément à la loi 78-17 du 6 janvier 1978 modifiée relative à l'information, aux fichiers et aux
libertés, et au Règlement Général européen à la Protection des Données, vous avez la possibilité d’exercer vos
droits d’accès, de rectification, d’effacement, d’opposition, de limitation du traitement et de révocation de
votre consentement. Afin d'exercer vos droits, vous pouvez vous adresser : par courrier postal à : Métropole de
Lyon - Direction des Affaires Juridiques et de la Commande Publique - 20, rue du Lac - BP 33569 - 69505 Lyon
Cedex par courrier électronique en remplissant le formulaire dédié sur Toodego, le site des services et
démarches en ligne dans la Métropole de Lyon
</p>
</div>
</form>
<div
*ngIf="currentPage == nbPagesForm && !profile"
class="page"
......@@ -1340,7 +1379,7 @@
</svg>
<h3>Un courriel vous a été envoyé afin de valider votre inscription</h3>
</div>
<div *ngIf="currentPage == nbPagesForm && profile" class="lastPage">
<div *ngIf="currentPage == nbPagesForm && profile && !isEditMode" class="lastPage">
<div class="lastPage">
<div class="title">
<h3>
......@@ -1390,7 +1429,7 @@
Ok
</button>
<button
*ngIf="currentPage == nbPagesForm && profile"
*ngIf="currentPage == nbPagesForm && profile && !isEditMode"
class="btn-primary unique"
routerLink="/acteurs"
[queryParams]="{ id: createdStructure._id }"
......
......@@ -189,6 +189,14 @@ h4 {
margin-top: 18px;
color: $grey-2;
@include cn-regular-14;
a {
color: $default-link-color;
text-decoration: underline;
font-weight: bold;
}
}
&.notRequired {
font-style: italic;
}
}
.textareaBlock {
......@@ -560,7 +568,11 @@ img {
.section {
padding-bottom: 2rem;
}
.dataShareConsent {
::ng-deep button p {
font-weight: normal !important;
}
}
.missing-information {
display: flex;
color: $orange-warning;
......
......@@ -83,6 +83,8 @@ export class FormComponent implements OnInit {
// Structure id for edit mode
public structureId: string;
// last page for edit form
public lastPage = this.pageTypeEnum.cgu;
constructor(
private structureService: StructureService,
......@@ -320,6 +322,7 @@ export class FormComponent implements OnInit {
Validators.min(0),
]),
freeWorkShop: new FormControl(structure.freeWorkShop, [Validators.required]),
dataShareConsentDate: new FormControl(structure.dataShareConsentDate),
});
}
......@@ -590,7 +593,14 @@ export class FormComponent implements OnInit {
valid: this.getStructureControl('lockdownActivity').valid,
name: 'Informations spécifiques à la période COVID',
};
this.pagesValidation[PageTypeEnum.cgu] = { valid: this.userAcceptSavedDate };
if (this.isEditMode) {
this.pagesValidation[PageTypeEnum.cgu] = {
valid: this.getStructureControl('dataShareConsentDate').valid,
name: 'Partage de données sur data.grandlyon.com',
};
} else {
this.pagesValidation[PageTypeEnum.cgu] = { valid: this.userAcceptSavedDate };
}
this.updatePageValid();
}
}
......@@ -898,6 +908,12 @@ export class FormComponent implements OnInit {
this.setValidationsForm();
}
public acceptOpenData(isAccepted: boolean): void {
let now = new Date().toString();
this.getStructureControl('dataShareConsentDate').setValue(now);
this.setValidationsForm();
}
public acceptReceiveNewsletter(isAccepted: boolean): void {
this.userAcceptNewsletter = isAccepted;
}
......
......@@ -57,6 +57,10 @@
</div>
<app-signup-modal *ngIf="displaySignUp" [openned]="isPopUpOpen" (closed)="closeSignUpModal($event)"></app-signup-modal>
<app-data-share-consent
*ngIf="isDisplayDataShare"
[dataConsentPendingStructures]="dataConsentPendingStructures"
></app-data-share-consent>
<ng-template #customTitle>
<img class="desktop-show logo-grand-lyon" width="108" height="37" src="/assets/logos/resin.svg" alt />
......
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
import { Structure } from '../models/structure.model';
import { ProfileService } from '../profile/services/profile.service';
import { AuthService } from '../services/auth.service';
......@@ -15,6 +16,9 @@ export class HeaderComponent implements OnInit {
public currentRoute = '';
public formRoute = '/create-structure';
public returnUrl = null;
public dataConsentPendingStructures: Structure[];
private displayDataShare = false;
private loadingDataShare = false;
constructor(
private authService: AuthService,
......@@ -53,6 +57,24 @@ export class HeaderComponent implements OnInit {
return this.authService.isLoggedIn();
}
public get isDisplayDataShare(): boolean {
if (this.displayDataShare) {
return this.displayDataShare;
} else {
if (this.isLoggedIn && !this.loadingDataShare) {
this.loadingDataShare = true;
this.profileService.getAllDataConsentPendingStructures().subscribe((dataConsentPendingStructures) => {
if (dataConsentPendingStructures.length) {
this.displayDataShare = true;
this.dataConsentPendingStructures = dataConsentPendingStructures;
return this.displayDataShare;
}
});
}
}
return false;
}
public closeSignInModal(): void {
this.isPopUpOpen = false;
this.displaySignUp = true;
......
......@@ -106,7 +106,7 @@ export class MapComponent implements OnChanges {
);
}
}
// Handle map marker selection
// Handle map marker if none selected
if (changes.selectedMarkerId && this.map) {
this.map.closePopup();
if (changes.selectedMarkerId.currentValue === undefined) {
......@@ -115,14 +115,15 @@ export class MapComponent implements OnChanges {
this.getMarkerTypeByStructureId(changes.selectedMarkerId.previousValue)
);
this.map.setView(this.mapOptions.center, this.mapOptions.zoom);
} else {
this.mapService.setSelectedMarker(
changes.selectedMarkerId.currentValue,
this.getMarkerTypeByStructureId(changes.selectedMarkerId.currentValue)
);
this.centerLeafletMapOnMarker(changes.selectedMarkerId.currentValue);
}
}
// Handle map marker if one is set with url or selected
if (this.mapService.getMarker(this.selectedMarkerId)) {
this.mapService.setSelectedMarker(this.selectedMarkerId, this.getMarkerTypeByStructureId(this.selectedMarkerId));
this.centerLeafletMapOnMarker(this.selectedMarkerId);
}
this.closePreviousMarker(changes);
if (changes.structuresToPrint) {
if (changes.structuresToPrint.currentValue < changes.structuresToPrint.previousValue) {
......@@ -205,7 +206,7 @@ export class MapComponent implements OnChanges {
}
private getStructuresPositions(structureList: Structure[]): void {
structureList.forEach((structure: Structure) => {
for (const structure of structureList) {
this.mapService
.createMarker(
structure.getLat(),
......@@ -219,7 +220,8 @@ export class MapComponent implements OnChanges {
.on('popupopen', () => {
this.currentStructure = structure;
});
});
}
// Reset location if active to prevent graphical issue
if (this.locate) {
this.lc.stop();
......@@ -329,11 +331,13 @@ export class MapComponent implements OnChanges {
}
private centerLeafletMapOnMarker(markerId: string): void {
const marker = this.mapService.getMarker(markerId);
const latLngs = [marker.getLatLng()];
const markerBounds = latLngBounds(latLngs);
// paddingTopLeft is used for centering marker because of structure details pane
this.map.fitBounds(markerBounds, { paddingTopLeft: [300, 0] });
if (this.mapService.getMarker(markerId)) {
const marker = this.mapService.getMarker(markerId);
const latLngs = [marker.getLatLng()];
const markerBounds = latLngBounds(latLngs);
// paddingTopLeft is used for centering marker because of structure details pane
this.map.fitBounds(markerBounds, { paddingTopLeft: [300, 0] });
}
}
private initMetropoleLayer(): void {
......@@ -347,4 +351,21 @@ export class MapComponent implements OnChanges {
)
);
}
/**
* Close previous markers
* - if strucure is closed
* - if a new marker is selected
*/
private closePreviousMarker(changes: SimpleChanges): void {
if (
(changes.selectedMarkerId?.currentValue === undefined && changes.selectedMarkerId?.previousValue) ||
changes.selectedMarkerId?.currentValue !== changes.selectedMarkerId?.previousValue
) {
this.mapService.setUnactiveMarker(
changes.selectedMarkerId.previousValue,
this.getMarkerTypeByStructureId(changes.selectedMarkerId.previousValue)
);
}
}
}
......@@ -122,9 +122,7 @@ export class MapService {
public setUnactiveMarker(id: string, type: MarkerType = MarkerType.structure): void {
// To skip mouseleave when user emit click on structure list
if (!this.isMarkerActive) {
this.getMarker(id).setIcon(this.getMarkerIcon(type));
}
this.getMarker(id)?.setIcon(this.getMarkerIcon(type));
this.isMarkerActive = false;
}
......@@ -144,7 +142,7 @@ export class MapService {
*/
public setSelectedMarker(id: string, type: MarkerType = MarkerType.structure): void {
if (id) {
this.getMarker(id).setIcon(this.getActiveMarkerIcon(type));
this.getMarker(id)?.setIcon(this.getActiveMarkerIcon(type));
this.isMarkerActive = true;
}
}
......
......@@ -50,6 +50,7 @@ export class Structure {
public distance?: number;
public coord?: number[] = [];
public dataShareConsentDate?: string;
public accountVerified: boolean = false;
......
......@@ -5,6 +5,8 @@ import { User } from '../../models/user.model';
import decode from 'jwt-decode';
import { UserRole } from '../../shared/enum/userRole.enum';
import { AuthService } from '../../services/auth.service';
import { Structure } from '../../models/structure.model';
import { map } from 'rxjs/operators';
@Injectable({
providedIn: 'root',
......@@ -81,4 +83,8 @@ export class ProfileService {
public isEmailAlreadyUsed(newMail: string): Observable<boolean> {
return this.http.post<boolean>(`${this.baseUrl}/verify-exist-user`, { newMail });
}
public getAllDataConsentPendingStructures(): Observable<Structure[]> {
return this.http.get<Structure[]>(`${this.baseUrl}/dataConsentValidation`);
}
}
......@@ -36,6 +36,11 @@ export class StructureService {
public editStructure(structure: Structure): Observable<Structure> {
structure.updatedAt = new Date().toString();
if (structure.dataShareConsentDate) {
structure.dataShareConsentDate = new Date().toString();
} else {
structure.dataShareConsentDate = null;
}
const id = structure._id;
delete structure._id; // id should not be provided for update
return this.http.put(`${this.baseUrl}/${id}`, structure).pipe(map((item: Structure) => new Structure(item)));
......
......@@ -57,9 +57,13 @@ export class AddressAutocompleteComponent implements OnInit {
public selectedResult(hit: any): void {
const address = new Address();
address.numero = hit.properties.housenumber ? hit.properties.housenumber : null;
address.street = hit.properties.street;
address.commune = hit.properties.city;
address.coordinates = hit.geometry.coordinates;
if (hit.properties.street) {
address.street = hit.properties.street;
} else {
address.street = hit.properties.name;
}
const value = this.parseHitToAddress(hit);