diff --git a/src/app/form/orientation-form/component/structure-detail-print/structure-detail-print.component.html b/src/app/form/orientation-form/component/structure-detail-print/structure-detail-print.component.html index d4778617218616100830522f78ccec64176c7fbe..b6e5929554c2048fb14fa11bdf3e15825df6f743 100644 --- a/src/app/form/orientation-form/component/structure-detail-print/structure-detail-print.component.html +++ b/src/app/form/orientation-form/component/structure-detail-print/structure-detail-print.component.html @@ -10,7 +10,7 @@ <h3>{{ structure.getLabelTypeStructure() }}</h3> </div> </div> - <div fxLayout="row" class="mobile-column"> + <div class="mobile-column"> <div fxLayout="column" fxFlex="50%"> <div *ngIf="structure.address" fxLayout="row" fxLayoutAlign="none flex-end" fxLayoutGap="13px"> <app-svg-icon [type]="'ico'" [icon]="'adress'" [title]="'Adresse'"></app-svg-icon> @@ -119,7 +119,7 @@ <h4>{{ day.key | day }}</h4> <div class="opening-time" fxLayout="row" fxLayoutAlign="none flex-end"> <div *ngFor="let timeRange of day.value.time; let isFirst = first"> - <p *ngIf="isFirst">de {{ timeRange.formatOpeningDate() }} à {{ timeRange.formatClosingDate() }}</p> + <p *ngIf="isFirst && timeRange.opening">de {{ timeRange.formatOpeningDate() }} à {{ timeRange.formatClosingDate() }}</p> <p *ngIf="!isFirst && timeRange.opening"> et de {{ timeRange.formatOpeningDate() }} à {{ timeRange.formatClosingDate() }} </p> diff --git a/src/app/form/orientation-form/component/structure-detail-print/structure-detail-print.component.scss b/src/app/form/orientation-form/component/structure-detail-print/structure-detail-print.component.scss index 67ce48453c000b5ebf30a163522befae33234de6..664e18f7aaff83dfca747e86a3e6c72a547faafe 100644 --- a/src/app/form/orientation-form/component/structure-detail-print/structure-detail-print.component.scss +++ b/src/app/form/orientation-form/component/structure-detail-print/structure-detail-print.component.scss @@ -21,7 +21,7 @@ a { padding: 10px 24px; @media #{$tablet} { width: calc(100% - 2 * 24px); - position: fixed; + position: inherit; height: 100%; .printButton { display: none !important; @@ -137,3 +137,24 @@ p, margin-top: 15px; background: #348899; } + +.mobile-column { + @media #{$tablet} { + flex-direction: row; + } + @media #{$desktop} { + flex-direction: row; + } + @media #{$large-desktop} { + flex-direction: row; + } + @media #{$phone} { + flex-direction: column; + } + @media #{$small-phone} { + flex-direction: column; + } + @media #{$large-phone} { + flex-direction: column; + } +} \ No newline at end of file diff --git a/src/app/form/orientation-form/component/structure-print-header/structure-print-header.component.ts b/src/app/form/orientation-form/component/structure-print-header/structure-print-header.component.ts index 5e6ed970b3949748b02b48e2c53e859c73ea9170..20c827dec9dac2a4ce7f091ed254cea05685aac9 100644 --- a/src/app/form/orientation-form/component/structure-print-header/structure-print-header.component.ts +++ b/src/app/form/orientation-form/component/structure-print-header/structure-print-header.component.ts @@ -36,7 +36,7 @@ export class StructurePrintHeaderComponent implements OnInit { minute: 'numeric', }); - this.filters.map((elem) => { + this.filters.forEach((elem) => { switch (elem.name) { case 'proceduresAccompaniment': this.assistances.push(elem); diff --git a/src/app/form/orientation-form/orientation-form.component.html b/src/app/form/orientation-form/orientation-form.component.html index 5c163c2a6447344925898634a4c22a01287260a2..02e379de356b8ee287989f4d09fe319b15ed7719 100644 --- a/src/app/form/orientation-form/orientation-form.component.html +++ b/src/app/form/orientation-form/orientation-form.component.html @@ -229,15 +229,18 @@ (selectedAddress)="setAddressBeneficiary($event)" ></app-address-autocomplete> <app-svg-icon - *ngIf="getOrientationControl('address').valid" + *ngIf="getOrientationControl('address').valid && !isLoading" [iconClass]="'validation'" [type]="'form'" [icon]="'validate'" class="validateIcon" ></app-svg-icon> - <div *ngIf="!getOrientationControl('address').valid" (click)="getAddress()"> + <div *ngIf="!getOrientationControl('address').valid && !isLoading" (click)="getAddress()"> <app-svg-icon [type]="'ico'" [icon]="'locateMe'" class="markerIcon"></app-svg-icon> </div> + <div *ngIf="isLoading"> + <img class="loader-gif" src="/assets/gif/loader_circle.gif" alt /> + </div> </div> </div> <div class="title"> @@ -281,13 +284,13 @@ </div> </div> <div fxLayout="row" class="content-container"> - <div class="nbStructure-panel"> + <div class="nbStructure-panel left-pane" [ngClass]="{ mapPhone: isMapPhone == true }"> <div class="nbStructuresLabel" [ngPlural]="structuresList.length"> <ng-template ngPluralCase="0">0 structure trouvée</ng-template> <ng-template ngPluralCase="1">1 structure trouvée</ng-template> <ng-template ngPluralCase="other">{{ structuresList.length }} structures trouvées</ng-template> </div> - <div id="listCard" class="left-pane" (mouseleave)="mouseLeave()"> + <div id="listCard" (mouseleave)="mouseLeave()"> <app-card *ngFor="let structure of structuresList" [structure]="structure" @@ -302,22 +305,27 @@ </p> </div> </div> - <div class="right-pane"> - <div class="deep-map"> - <app-map - [structures]="structuresList" - [structuresToPrint]="structuresToPrint" - [toogleToolTipId]="displayMapMarkerId" - [selectedMarkerId]="selectedMarkerId" - [locate]="locate" - (locatationTrigger)="locatationTrigger($event)" - (selectedStructure)="showDetailStructure($event)" - [isMapPhone]="isMapPhone" - [searchedValue]="searchedValue" - [ngClass]="{ mapPhone: isMapPhone == true }" - ></app-map> - </div> + <div class="btnSwitch"> + <app-button + [style]="'roundedButton'" + [text]="isMapPhone ? 'Liste' : 'Carte'" + [iconBtn]="isMapPhone ? 'liste' : 'map-marker'" + (action)="switchMapList()" + ></app-button> </div> + <app-map + [structures]="structuresList" + [structuresToPrint]="structuresToPrint" + [toogleToolTipId]="displayMapMarkerId" + [selectedMarkerId]="selectedMarkerId" + [locate]="locate" + (locatationTrigger)="locatationTrigger($event)" + (selectedStructure)="showDetails($event)" + [isMapPhone]="isMapPhone" + [searchedValue]="searchedValue" + class="right-pane deep-map" + [ngClass]="{ mapPhone: isMapPhone == true }" + ></app-map> </div> </div> <!-- BENEFICIARY ACCOMPANIMENT --> @@ -436,6 +444,27 @@ ></app-footer-form> </div> </div> + + <div *ngIf="currentPage != 0 && currentPage != pageTypeEnum.printResults" class="footer phone"> + <div fxLayout="row" fxLayoutAlign="center center"> + <app-footer-form + [btnName]="['Précédent', 'Suivant']" + (previousPage)="previousPage()" + (nextPage)="nextPage()" + [isValid]="isPageValid" + ></app-footer-form> + </div> + </div> + <div *ngIf="currentPage == pageTypeEnum.printResults" class="footer phone"> + <div fxLayout="row" fxLayoutAlign="center center"> + <app-footer-form + [btnName]="['Précédent', 'Imprimer']" + (previousPage)="previousPage()" + (nextPage)="runMultiPrint(true)" + [isValid]="isPageValid" + ></app-footer-form> + </div> + </div> </div> <app-structure-list-print diff --git a/src/app/form/orientation-form/orientation-form.component.scss b/src/app/form/orientation-form/orientation-form.component.scss index ced3349a7e0f71253bffb910d2fc989779d24cc5..dbeffc59d2c335187f455df2261603f35235f3c9 100644 --- a/src/app/form/orientation-form/orientation-form.component.scss +++ b/src/app/form/orientation-form/orientation-form.component.scss @@ -98,3 +98,59 @@ padding-left: 9px; width: 100%; } + +.footer { + padding: 17px 0; + width: 100%; + max-width: 960px; + margin: 20px auto; + text-align: center; + &.desktop { + @media #{$tablet} { + display: none; + } + } + + &.phone { + display: none; + @media #{$tablet} { + margin: 0 auto; + border-top: 1px solid $grey-4; + display: block; + } + } +} + +.btnSwitch { + position: fixed; + left: 50%; + bottom: $footer-height + 5px; + transform: translate(-50%, -50%); + margin: 0 auto; + display: none; + @media #{$tablet} { + display: block; + opacity: 0.8; + z-index: $btn-phone-switch-map-list-z-index; + } + @media #{$large-phone} { + } +} + +.loader-gif { + @media #{$desktop} { + width: 20%; + } + @media #{$large-desktop} { + width: 20%; + } + @media #{$large-phone} { + width: 100%; + } + @media #{$small-phone} { + width: 100%; + } + @media #{$phone} { + width: 100%; + } +} diff --git a/src/app/form/orientation-form/orientation-form.component.ts b/src/app/form/orientation-form/orientation-form.component.ts index 83a83bf27a974b65141ea5af1152b2fb40d544eb..a76082df793cdbf61c3d03a9ba1fe18943dd1521 100644 --- a/src/app/form/orientation-form/orientation-form.component.ts +++ b/src/app/form/orientation-form/orientation-form.component.ts @@ -26,6 +26,8 @@ export class OrientationFormComponent implements OnInit { public selectedMarkerId: string; public locate = false; public noPassNumeric = false; + public isMapPhone = false; + public isLoading = false; public orientationForm: FormGroup; @@ -194,6 +196,7 @@ export class OrientationFormComponent implements OnInit { } this.currentPage--; this.progressStatus -= 100 / this.nbPagesForm; + this.setStructuresAndCoord(); this.updatePageValid(); } } @@ -341,7 +344,7 @@ export class OrientationFormComponent implements OnInit { public searchStructures(): void { this.filters = []; if (this.orientationForm.value.passNumeric) { - this.filters.push(new Filter('labelsQualifications', 'passNumerique', 'Passe Numérique')); + this.filters.push(new Filter('labelsQualifications', 'passNumerique', 'Pass Numérique')); } if (this.orientationForm.value.specificProfile) { this.orientationForm.get('specificProfile').value.forEach((element) => { @@ -371,7 +374,7 @@ export class OrientationFormComponent implements OnInit { } public removeDoublonFilters(): void { - this.uncheckedFilters.map((elem) => { + this.uncheckedFilters.forEach((elem) => { this.filters = this.filters.filter((filter) => filter.value != elem.value); }); this.setStructuresAndCoord(); @@ -379,7 +382,7 @@ export class OrientationFormComponent implements OnInit { public findEquipmentName(equipment): string { let name; - this.equipmentReferentiel.modules.map((elem) => { + this.equipmentReferentiel.modules.forEach((elem) => { if (elem.id === equipment) { name = elem.text; } @@ -389,7 +392,7 @@ export class OrientationFormComponent implements OnInit { public findAssistanceName(skill): string { let name; - this.assistanceReferentiel.modules.map((elem) => { + this.assistanceReferentiel.modules.forEach((elem) => { if (elem.id === skill) { name = elem.text; } @@ -400,31 +403,31 @@ export class OrientationFormComponent implements OnInit { public findTrainingCategoryForSkill(skill): any { let infos = { categ: '', name: '' }; - this.baseSkillssReferentiel.modules.map((elem) => { + this.baseSkillssReferentiel.modules.forEach((elem) => { if (elem.id === skill) { infos.categ = this.baseSkillssReferentiel.id; infos.name = elem.text; } }); - this.accessRightsReferentiel.modules.map((elem) => { + this.accessRightsReferentiel.modules.forEach((elem) => { if (elem.id === skill) { infos.categ = this.accessRightsReferentiel.id; infos.name = elem.text; } }); - this.parentingHelpsReferentiel.modules.map((elem) => { + this.parentingHelpsReferentiel.modules.forEach((elem) => { if (elem.id === skill) { infos.categ = this.parentingHelpsReferentiel.id; infos.name = elem.text; } }); - this.socialAndProfessionalsReferentiel.modules.map((elem) => { + this.socialAndProfessionalsReferentiel.modules.forEach((elem) => { if (elem.id === skill) { infos.categ = this.socialAndProfessionalsReferentiel.id; infos.name = elem.text; } }); - this.digitalCultureSecuritysReferentiel.modules.map((elem) => { + this.digitalCultureSecuritysReferentiel.modules.forEach((elem) => { if (elem.id === skill) { infos.categ = this.digitalCultureSecuritysReferentiel.id; infos.name = elem.text; @@ -503,18 +506,25 @@ export class OrientationFormComponent implements OnInit { this.setStructuresAndCoord(); } + public switchMapList(): void { + this.isMapPhone = !this.isMapPhone; + } + public getAddress(): void { navigator.geolocation.getCurrentPosition((position) => { + this.isLoading = true; this.geoJsonService.getAddressByCoord(position.coords.longitude, position.coords.latitude).subscribe( (location) => { - location.properties.housenumber - ? this.getOrientationControl('address').get('numero').setValue(location.properties.housenumber) - : null; + if (location.properties.housenumber) { + this.getOrientationControl('address').get('numero').setValue(location.properties.housenumber); + } this.getOrientationControl('address').get('street').setValue(location.properties.street); this.getOrientationControl('address').get('commune').setValue(location.properties.city); this.setValidationsForm(); + this.isLoading = false; }, (err) => { + this.isLoading = false; throw new Error(err); } ); diff --git a/src/app/legal-notice/legal-notice.component.html b/src/app/legal-notice/legal-notice.component.html index aca06d1cc73d93d3eb318554f3cbba3929fa8ec8..a806bda889b03049013961ead4083368971435fb 100644 --- a/src/app/legal-notice/legal-notice.component.html +++ b/src/app/legal-notice/legal-notice.component.html @@ -1,7 +1,7 @@ <div fxLayout="column" class="content-container"> <h1 style="display: none">Mentions légales</h1> <div class="section-container"> - <h2>Mentions légales du réseau des acteurs de la médiation numérique sur le territoire de la métropole de Lyon</h2> + <h1>Mentions légales du réseau des acteurs de la médiation numérique sur le territoire de la métropole de Lyon</h1> <p> Métropole de Lyon - 20 rue du Lac – CS 33569 - 69505 Lyon cedex 03<br /> Tél : (33) 4 78 63 40 40<br /> @@ -37,7 +37,7 @@ numérique de la Métropole de Lyon. </p> <p> - Elles sont conservées tant que leurs utilisations nous est indispensables et sont destinées aux administrateurs de + Elles sont conservées jusqu'à 18 mois tant que leurs utilisations nous est indispensables et sont destinées aux administrateurs de la plateforme de la Métropole de Lyon. </p> <p> diff --git a/src/app/map/components/map.component.ts b/src/app/map/components/map.component.ts index e432b027e8bab619bbd1aea9443f5e2eacb9a7be..d3871abcfaf3293dfc5e1e6030895ad3920d1969 100644 --- a/src/app/map/components/map.component.ts +++ b/src/app/map/components/map.component.ts @@ -141,6 +141,10 @@ export class MapComponent implements OnChanges { } else if (this.structures) { this.map = this.mapService.cleanMap(this.map); this.getStructuresPositions(this.structures); + this.structuresToPrint.forEach((structure: Structure) => { + this.mapService.setAddedToListMarker(structure._id); + }); + } } diff --git a/src/app/structure-list/components/structure-details/structure-details.component.html b/src/app/structure-list/components/structure-details/structure-details.component.html index 5d5fcd8d6e6826b2321aa1e3626dad73ff4bbe2d..14d8b2826cb1b8af9faea2342dbe3d3c02308bea 100644 --- a/src/app/structure-list/components/structure-details/structure-details.component.html +++ b/src/app/structure-list/components/structure-details/structure-details.component.html @@ -187,7 +187,7 @@ <h4>{{ day.key | day }}</h4> <div class="opening-time" fxLayout="row" fxLayoutAlign="none flex-end"> <div *ngFor="let timeRange of day.value.time; let isFirst = first"> - <p *ngIf="isFirst">de {{ timeRange.formatOpeningDate() }} à {{ timeRange.formatClosingDate() }}</p> + <p *ngIf="isFirst && timeRange.opening">de {{ timeRange.formatOpeningDate() }} à {{ timeRange.formatClosingDate() }}</p> <p *ngIf="!isFirst && timeRange.opening"> et de {{ timeRange.formatOpeningDate() }} à {{ timeRange.formatClosingDate() }} </p> diff --git a/src/app/structure-list/components/structure-details/structure-details.component.scss b/src/app/structure-list/components/structure-details/structure-details.component.scss index a5f96348846e57ff7e63623754888e84528c1e9d..8942e91a98032a60065af0729d6207faf0b8036f 100644 --- a/src/app/structure-list/components/structure-details/structure-details.component.scss +++ b/src/app/structure-list/components/structure-details/structure-details.component.scss @@ -23,7 +23,7 @@ a { overflow: auto; @media #{$tablet} { width: calc(100% - 2 * 24px); - position: fixed; + position: inherit; height: 100%; .printButton { display: none !important; diff --git a/src/index.html b/src/index.html index 19f2458a1b22bfa974f666c111397e8ecf7f63bf..d27d893783f19ed184fa8554311ebbcf3764ee06 100644 --- a/src/index.html +++ b/src/index.html @@ -8,19 +8,19 @@ <title>Réseau des Acteurs de l'Inclusion Numérique de la Métropole de Lyon</title> <!-- Search Engine --> - <meta name="title" content="Réseau des acteurs de la médiation numérique" /> + <meta name="title" content="Rés'in : plateforme à destination des acteurs de l'inclusion numérique de la métropole de Lyon" /> <meta name="description" - content="Plateforme à destination des acteurs de l'inclusion numérique de la métropole de Lyon" + content="Retrouver tous les lieux de la médiation numérique de la métropole mais aussi les actualités, projets, ressources, études et appels à projet liès à l'inclusion numérique..." /> <meta name="image" content="https://resin.grandlyon.com/assets/logos/logo_1200.jpg" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <!-- Open Graph general --> - <meta property="og:title" content="Réseau des Acteurs de la Médiation" /> + <meta property="og:title" content="Rés'in : plateforme à destination des acteurs de l'inclusion numérique de la métropole de Lyon" /> <meta property="og:description" - content="Plateforme à destination des acteurs de l'inclusion numérique de la métropole de Lyon" + content="Retrouver tous les lieux de la médiation numérique de la métropole mais aussi les actualités, projets, ressources, études et appels à projet liès à l'inclusion numérique..." /> <meta property="og:image" content="https://resin.grandlyon.com/assets/logos/logo_1200.jpg" /> <meta property="og:image:type" content="image/jpeg" /> @@ -33,7 +33,7 @@ <meta name="twitter:title" content="Réseau des Acteurs de la Médiation" /> <meta name="twitter:description" - content="Plateforme à destination des acteurs de l'inclusion numérique de la métropole de Lyon" + content="Retrouver tous les lieux de la médiation numérique de la métropole mais aussi les actualités, projets, ressources, études et appels à projet liès à l'inclusion numérique..." /> <meta name="twitter:image" content="https://resin.grandlyon.com/assets/logos/logo_1200.jpg" /> <meta name="twitter:url" content="https://resin.grandlyon.com" />