From c5d0e1473c9b3f46fba1c6a761bea8d987e02a31 Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Mon, 12 Apr 2021 14:50:51 +0200 Subject: [PATCH 01/30] change regex for email --- src/app/utils/CustomRegExp.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/utils/CustomRegExp.ts b/src/app/utils/CustomRegExp.ts index a4c02ad0..ab2b98c5 100644 --- a/src/app/utils/CustomRegExp.ts +++ b/src/app/utils/CustomRegExp.ts @@ -6,7 +6,7 @@ export class CustomRegExp { /** * Validate an email */ - public static readonly EMAIL: RegExp = /^[a-z0-9.-]+@[a-z0-9.-]+[.][a-z]{2,3}/; //NOSONAR + public static readonly EMAIL: RegExp = /^[a-z0-9.-_]+@[a-z0-9.-]+[.][a-z]{2,3}/; //NOSONAR public static readonly TEXT_WITHOUT_NUMBER: RegExp = /^[A-Za-zÀ-ÖØ-öø-ÿ- ]{1,}$/; //NOSONAR /** * Validate a password (at least 8 characters, 1 uppercase letter, 1 lowercase letter, 1 number, and 1 special character) -- GitLab From e2244d3d621880f056126bdf8b99eb0aa8e4c729 Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Mon, 12 Apr 2021 17:35:45 +0200 Subject: [PATCH 02/30] add querystring to route param --- .../components/search/search.component.ts | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/app/structure-list/components/search/search.component.ts b/src/app/structure-list/components/search/search.component.ts index b743d1cf..82e9ec82 100644 --- a/src/app/structure-list/components/search/search.component.ts +++ b/src/app/structure-list/components/search/search.component.ts @@ -9,6 +9,8 @@ import { Filter } from '../../models/filter.model'; import { Module } from '../../models/module.model'; import { StructureCounter } from '../../models/structureCounter.model'; import { SearchService } from '../../services/search.service'; +import { Location } from '@angular/common'; +import { ActivatedRoute } from '@angular/router'; @Component({ selector: 'app-structure-list-search', @@ -36,20 +38,34 @@ export class SearchComponent implements OnInit, OnChanges { public numberAccompanimentChecked = 0; public numberMoreFiltersChecked = 0; + public queryString = 'placeholder'; // Modal confirmation variable public isConfirmationModalOpen = false; public confirmationModalContent = 'Afin d’ajouter votre structure,vous allez être redirigé vers le formulaire Grand Lyon à remplir.'; - constructor(public searchService: SearchService, private fb: FormBuilder, private geoJsonService: GeojsonService) { + constructor( + public searchService: SearchService, + private fb: FormBuilder, + private geoJsonService: GeojsonService, + private activatedRoute: ActivatedRoute, + private location: Location + ) { this.searchForm = this.fb.group({ searchTerm: '', }); } ngOnInit(): void { // Will store the different categories + this.queryString = this.activatedRoute.snapshot.queryParamMap.get('search'); this.categories = []; this.checkedModulesFilter = new Array(); + if (this.queryString) { + console.log('we search', this.queryString); + const filters: Filter[] = []; + filters.push(new Filter('query', this.queryString)); + this.searchEvent.emit(filters); + } } ngOnChanges(changes: SimpleChanges): void { @@ -75,6 +91,13 @@ export class SearchComponent implements OnInit, OnChanges { // Sends an array containing all filters public applyFilter(term: string): void { // Add search input filter + if (term) { + this.location.go('/acteurs?search=' + term); + } else { + this.location.go('/acteurs'); + } + this.queryString = this.activatedRoute.snapshot.queryParamMap.get('search'); + console.log('query string is:', this.queryString); const filters: Filter[] = []; if (term) { filters.push(new Filter('query', term)); -- GitLab From 0aca5b2128f5199ac20aad57d9e7743f7d60d135 Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Tue, 13 Apr 2021 10:49:42 +0200 Subject: [PATCH 03/30] fix auto reload of structure --- src/app/carto/carto.component.ts | 18 +++++++++++++----- .../components/search/search.component.ts | 2 -- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/app/carto/carto.component.ts b/src/app/carto/carto.component.ts index d55b420b..5d771dc4 100644 --- a/src/app/carto/carto.component.ts +++ b/src/app/carto/carto.component.ts @@ -8,6 +8,7 @@ import { Filter } from '../structure-list/models/filter.model'; import { GeoJson } from '../map/models/geojson.model'; import { GeojsonService } from '../services/geojson.service'; import { CustomRegExp } from '../utils/CustomRegExp'; +import { ActivatedRoute } from '@angular/router'; @Component({ selector: 'app-carto', @@ -26,14 +27,21 @@ export class CartoComponent implements OnInit { public isMapPhone = false; public searchedValue = null; public locate = false; // Use to sync location between search and map - constructor(private structureService: StructureService, private geoJsonService: GeojsonService) {} + constructor( + private structureService: StructureService, + private geoJsonService: GeojsonService, + private activatedRoute: ActivatedRoute + ) {} ngOnInit(): void { - if (navigator.geolocation) { - this.getLocation(); - } else { - this.getStructures(null); + if (!this.activatedRoute.snapshot.queryParamMap.get('search')) { + if (navigator.geolocation) { + this.getLocation(); + } else { + this.getStructures(null); + } } + if (history.state.data) { this.currentStructure = new Structure(history.state.data); } diff --git a/src/app/structure-list/components/search/search.component.ts b/src/app/structure-list/components/search/search.component.ts index 82e9ec82..a0a863b1 100644 --- a/src/app/structure-list/components/search/search.component.ts +++ b/src/app/structure-list/components/search/search.component.ts @@ -61,7 +61,6 @@ export class SearchComponent implements OnInit, OnChanges { this.categories = []; this.checkedModulesFilter = new Array(); if (this.queryString) { - console.log('we search', this.queryString); const filters: Filter[] = []; filters.push(new Filter('query', this.queryString)); this.searchEvent.emit(filters); @@ -97,7 +96,6 @@ export class SearchComponent implements OnInit, OnChanges { this.location.go('/acteurs'); } this.queryString = this.activatedRoute.snapshot.queryParamMap.get('search'); - console.log('query string is:', this.queryString); const filters: Filter[] = []; if (term) { filters.push(new Filter('query', term)); -- GitLab From 8e9f59796fb1da5a2bd5ebea900b521057231c03 Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Tue, 13 Apr 2021 11:03:41 +0200 Subject: [PATCH 04/30] remove useless lines --- src/app/structure-list/components/search/search.component.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/structure-list/components/search/search.component.ts b/src/app/structure-list/components/search/search.component.ts index a0a863b1..e6011a8f 100644 --- a/src/app/structure-list/components/search/search.component.ts +++ b/src/app/structure-list/components/search/search.component.ts @@ -38,7 +38,7 @@ export class SearchComponent implements OnInit, OnChanges { public numberAccompanimentChecked = 0; public numberMoreFiltersChecked = 0; - public queryString = 'placeholder'; + public queryString: string; // Modal confirmation variable public isConfirmationModalOpen = false; public confirmationModalContent = @@ -95,7 +95,6 @@ export class SearchComponent implements OnInit, OnChanges { } else { this.location.go('/acteurs'); } - this.queryString = this.activatedRoute.snapshot.queryParamMap.get('search'); const filters: Filter[] = []; if (term) { filters.push(new Filter('query', term)); -- GitLab From 7232a21ad41fffd63272b3bec7afe49f961fba53 Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Tue, 13 Apr 2021 15:23:49 +0200 Subject: [PATCH 05/30] redirection on login now to acteurs --- .../shared/components/signup-modal/signup-modal.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/components/signup-modal/signup-modal.component.ts b/src/app/shared/components/signup-modal/signup-modal.component.ts index 128646d1..1ea02ace 100644 --- a/src/app/shared/components/signup-modal/signup-modal.component.ts +++ b/src/app/shared/components/signup-modal/signup-modal.component.ts @@ -33,7 +33,7 @@ export class SignUpModalComponent implements OnInit { password: ['', [Validators.required, Validators.pattern(CustomRegExp.PASSWORD)]], }); // get return url from route parameters or default to '/' - this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/'; + this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/acteurs'; } // getter for form fields -- GitLab From cd68c31ed73329d0ff244e92ce4bd7b9ef5059c2 Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Tue, 13 Apr 2021 17:21:57 +0200 Subject: [PATCH 06/30] fix: send query string to structure details components --- .../structure-list/components/card/card.component.ts | 12 +++++++++--- src/app/structure-list/structure-list.component.html | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/app/structure-list/components/card/card.component.ts b/src/app/structure-list/components/card/card.component.ts index 5d2d7dd6..8a1b657e 100644 --- a/src/app/structure-list/components/card/card.component.ts +++ b/src/app/structure-list/components/card/card.component.ts @@ -45,11 +45,17 @@ export class CardComponent implements OnInit { public cardClicked(): void { this.showDetails.emit(this.structure); + const queryString = this.route.snapshot.queryParamMap.get('search'); this.router.navigate([], { relativeTo: this.route, - queryParams: { - id: this.structure._id, - }, + queryParams: queryString + ? { + id: this.structure._id, + search: queryString, + } + : { + id: this.structure._id, + }, }); } diff --git a/src/app/structure-list/structure-list.component.html b/src/app/structure-list/structure-list.component.html index 951c2726..1b39ec64 100644 --- a/src/app/structure-list/structure-list.component.html +++ b/src/app/structure-list/structure-list.component.html @@ -16,7 +16,7 @@

Il n'y a aucune réponse correspondant à votre recherche

-- GitLab From cd6af4d6f0b7d8860594264f883c2714d22f9f53 Mon Sep 17 00:00:00 2001 From: Hugo SUBTIL Date: Wed, 14 Apr 2021 10:18:44 +0200 Subject: [PATCH 07/30] feat: remover unused fields --- src/app/form/form.component.spec.ts | 1 - src/app/structure-list/structure-list.component.spec.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src/app/form/form.component.spec.ts b/src/app/form/form.component.spec.ts index 940d9cf2..2b56ca73 100644 --- a/src/app/form/form.component.spec.ts +++ b/src/app/form/form.component.spec.ts @@ -42,7 +42,6 @@ describe('FormComponent', () => { contactSurname: new FormControl('structure.contactSurname'), fonction: new FormControl('structure.fonction'), pmrAccess: new FormControl('structure.pmrAccess'), - documentsMeeting: new FormControl('structure.documentsMeeting'), hours: new FormGroup({ monday: new FormGroup({ open: new FormControl(true, Validators.required), diff --git a/src/app/structure-list/structure-list.component.spec.ts b/src/app/structure-list/structure-list.component.spec.ts index f7e967fc..fde14c72 100644 --- a/src/app/structure-list/structure-list.component.spec.ts +++ b/src/app/structure-list/structure-list.component.spec.ts @@ -56,7 +56,6 @@ describe('StructureListComponent', () => { bornesNumeriques: '', imprimantes: '', autresEspacesProposesParLaStructure: 'Espace libre service', - statutJuridique: '', appartenezVousAUnReseauDeMediation: '', precisezLequel: '', idDeLitemStructureDansDirectus: 123, -- GitLab From 4cafe7d707f9c90f7c6822520837248be9c568ec Mon Sep 17 00:00:00 2001 From: Hugo SUBTIL Date: Wed, 14 Apr 2021 11:46:51 +0200 Subject: [PATCH 08/30] fix: search query param --- .../admin/components/panel/panel.component.ts | 3 +-- .../components/search/search.component.ts | 16 +++++++++++----- .../structure-details.component.ts | 6 +++++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/app/admin/components/panel/panel.component.ts b/src/app/admin/components/panel/panel.component.ts index 15052b62..47b40251 100644 --- a/src/app/admin/components/panel/panel.component.ts +++ b/src/app/admin/components/panel/panel.component.ts @@ -15,10 +15,9 @@ export class PanelComponent implements OnInit { ngOnInit(): void { this.selectedFeature = this.features.pendingStructures; - console.log(this.ghostLink); } - public changeActiveFeature(newFeature: AdminPannelEnum) { + public changeActiveFeature(newFeature: AdminPannelEnum): void { this.selectedFeature = newFeature; } } diff --git a/src/app/structure-list/components/search/search.component.ts b/src/app/structure-list/components/search/search.component.ts index e6011a8f..a95eacea 100644 --- a/src/app/structure-list/components/search/search.component.ts +++ b/src/app/structure-list/components/search/search.component.ts @@ -10,7 +10,7 @@ import { Module } from '../../models/module.model'; import { StructureCounter } from '../../models/structureCounter.model'; import { SearchService } from '../../services/search.service'; import { Location } from '@angular/common'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; @Component({ selector: 'app-structure-list-search', @@ -49,7 +49,9 @@ export class SearchComponent implements OnInit, OnChanges { private fb: FormBuilder, private geoJsonService: GeojsonService, private activatedRoute: ActivatedRoute, - private location: Location + private location: Location, + private route: ActivatedRoute, + private router: Router ) { this.searchForm = this.fb.group({ searchTerm: '', @@ -91,9 +93,13 @@ export class SearchComponent implements OnInit, OnChanges { public applyFilter(term: string): void { // Add search input filter if (term) { - this.location.go('/acteurs?search=' + term); - } else { - this.location.go('/acteurs'); + this.router.navigate(['/acteurs'], { + relativeTo: this.route, + queryParams: { + search: term, + }, + queryParamsHandling: 'merge', + }); } const filters: Filter[] = []; if (term) { diff --git a/src/app/structure-list/components/structure-details/structure-details.component.ts b/src/app/structure-list/components/structure-details/structure-details.component.ts index 79042b40..ae688aea 100644 --- a/src/app/structure-list/components/structure-details/structure-details.component.ts +++ b/src/app/structure-list/components/structure-details/structure-details.component.ts @@ -121,8 +121,12 @@ export class StructureDetailsComponent implements OnInit { } public close(): void { - this.router.navigate([], { + this.router.navigate(['/acteurs'], { relativeTo: this.route, + queryParams: { + id: null, + }, + queryParamsHandling: 'merge', }); } -- GitLab From 3e259fb09f8a8f57571aa9cbcebbf8e2cb7fce2f Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Wed, 14 Apr 2021 17:06:16 +0200 Subject: [PATCH 09/30] fix: change login redirection --- .../shared/components/signup-modal/signup-modal.component.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/app/shared/components/signup-modal/signup-modal.component.ts b/src/app/shared/components/signup-modal/signup-modal.component.ts index 1ea02ace..1ca87953 100644 --- a/src/app/shared/components/signup-modal/signup-modal.component.ts +++ b/src/app/shared/components/signup-modal/signup-modal.component.ts @@ -15,7 +15,6 @@ export class SignUpModalComponent implements OnInit { public loading = false; public submitted = false; public authFailed = false; - public returnUrl: string; public isShowPassword = false; constructor( private formBuilder: FormBuilder, @@ -32,8 +31,6 @@ export class SignUpModalComponent implements OnInit { email: ['', [Validators.required, Validators.pattern(CustomRegExp.EMAIL)]], password: ['', [Validators.required, Validators.pattern(CustomRegExp.PASSWORD)]], }); - // get return url from route parameters or default to '/' - this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/acteurs'; } // getter for form fields @@ -68,7 +65,7 @@ export class SignUpModalComponent implements OnInit { .pipe(first()) .subscribe( () => { - this.router.navigate([this.returnUrl]); + this.router.navigate([this.router.url]); this.closeModal(); }, () => { -- GitLab From 76c3c42a258cf886ab66563d9715f76f08f4d890 Mon Sep 17 00:00:00 2001 From: Hugo SUBTIL Date: Thu, 15 Apr 2021 10:02:41 +0200 Subject: [PATCH 10/30] refacto: change time format --- src/app/carto/carto.component.ts | 2 +- src/app/form/form.component.ts | 2 +- src/app/models/time.model.ts | 14 ++--- src/app/services/structure.service.ts | 58 +++++++++---------- .../hour-picker/hour-picker.component.ts | 33 ++--------- src/app/shared/validator/form.ts | 6 +- .../structure-details.component.ts | 5 +- 7 files changed, 45 insertions(+), 75 deletions(-) diff --git a/src/app/carto/carto.component.ts b/src/app/carto/carto.component.ts index d55b420b..e0319adc 100644 --- a/src/app/carto/carto.component.ts +++ b/src/app/carto/carto.component.ts @@ -85,7 +85,7 @@ export class CartoComponent implements OnInit { if (this.geolocation) { structure = this.getStructurePosition(structure, lon, lat); } - return this.structureService.updateOpeningStructure(structure, DateTime.local()); + return this.structureService.updateOpeningStructure(structure); }) ).then((structureList) => { structureList = _.sortBy(structureList, ['distance']); diff --git a/src/app/form/form.component.ts b/src/app/form/form.component.ts index 4e25894a..331209f4 100644 --- a/src/app/form/form.component.ts +++ b/src/app/form/form.component.ts @@ -840,7 +840,7 @@ export class FormComponent implements OnInit { let user: User; if (this.isEditMode) { this.structureService.editStructure(structure).subscribe((s: Structure) => { - this.createdStructure = this.structureService.updateOpeningStructure(s, DateTime.local()); + this.createdStructure = this.structureService.updateOpeningStructure(s); this.editForm = this.createStructureForm(s); }); } else { diff --git a/src/app/models/time.model.ts b/src/app/models/time.model.ts index f339333b..9f8e76d6 100644 --- a/src/app/models/time.model.ts +++ b/src/app/models/time.model.ts @@ -1,6 +1,6 @@ export class Time { - openning: number; - closing: number; + openning: string; + closing: string; constructor(obj?: any) { Object.assign(this, obj); @@ -14,13 +14,7 @@ export class Time { return this.formatDate(this.closing); } - private formatDate(n: number): string { - if (n.toString().length === 3) { - const tabNum = n.toString().match(/.{1,1}/g); - return tabNum[0] + 'h' + tabNum[1] + tabNum[2]; - } else if (n.toString().length === 4) { - const tabNum = n.toString().match(/.{1,2}/g); - return tabNum[0] + 'h' + tabNum[1]; - } + private formatDate(n: string): string { + return n.replace(':', 'h'); } } diff --git a/src/app/services/structure.service.ts b/src/app/services/structure.service.ts index 50758239..4305bcf4 100644 --- a/src/app/services/structure.service.ts +++ b/src/app/services/structure.service.ts @@ -4,6 +4,7 @@ import { WeekDay } from '@angular/common'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import * as _ from 'lodash'; +const { DateTime } = require('luxon'); import { Structure } from '../models/structure.model'; import { Day } from '../models/day.model'; @@ -98,31 +99,23 @@ export class StructureService { * Update opening hours of structure * @param structure Structure model */ - public updateOpeningStructure(structure: Structure, dateTime): Structure { + public updateOpeningStructure(structure: Structure): Structure { // Get current day of week - const currentDate = dateTime; + const currentDate = DateTime.local(); const dayOfWeek: number = currentDate.weekday; - // Checks if minutes start with zero to avoid deletion - let now: number; - if (currentDate.minute.toString().length !== 1) { - now = parseInt('' + currentDate.hour + currentDate.minute, 10); - } else { - now = parseInt('' + currentDate.hour + 0 + currentDate.minute, 10); - } - // Get the schedules of a structure according to his day to indicate if it's open const structureSchedules: Day = structure.getDayhours(dayOfWeek); structure.isOpen = false; if (structureSchedules.open) { structureSchedules.time.forEach((period: Time) => { - if (this.compareSchedules(period.openning, period.closing, now)) { + if (this.compareSchedules(period.openning, period.closing, currentDate)) { structure.isOpen = true; } }); } - structure.openedOn = this.getNextOpening(structure, dayOfWeek, now); + structure.openedOn = this.getNextOpening(structure, dayOfWeek, currentDate); //TODO: return structure; } @@ -132,8 +125,14 @@ export class StructureService { * @param endTime end of period * @param currentTime actual time */ - private compareSchedules(startTime: number, endTime: number, currentTime: number): boolean { - return currentTime >= startTime && currentTime <= endTime; + private compareSchedules(startTime: string, endTime: string, currentTime: typeof DateTime): boolean { + const day = currentTime.toISO().split('T')[0]; + let start = DateTime.fromISO(`${day}T${startTime}`); + if (startTime.length === 4) { + start = DateTime.fromISO(`${day}T0${startTime}`); + } + const end = DateTime.fromISO(`${day}T${endTime}`); + return currentTime > start && currentTime < end; } // Get enum key @@ -145,8 +144,11 @@ export class StructureService { }); return keys.length > 0 ? parseInt(keys[0]) : null; } - private getNextOpening(s: Structure, dayOfWeek: number, hourBase: number): OpeningDay { + + private getNextOpening(s: Structure, dayOfWeek: number, currentTime: typeof DateTime): OpeningDay { let periodBeforeCurrentDay = null; + const time = currentTime.toISO().split('T')[1]; + const currentHour = new Date('1/1/1999 ' + time.split('+')[0]); // Browse day of week for (const [i, period] of Object.entries(s.hours)) { @@ -154,13 +156,16 @@ export class StructureService { // Check if it's current day if (i === this.numberToDay(dayOfWeek)) { if ( - (period.time[0].openning <= hourBase && period.time[0].closing >= hourBase) || - (period.time[1] && period.time[1].openning <= hourBase && period.time[1].closing >= hourBase) + (new Date('1/1/1999 ' + period.time[0].openning) <= currentHour && + new Date('1/1/1999 ' + period.time[0].closing) >= currentHour) || + (period.time[1] && + new Date('1/1/1999 ' + period.time[1].openning) <= currentHour && + new Date('1/1/1999 ' + period.time[1].closing) >= currentHour) ) { return new OpeningDay(i, null); - } else if (period.time[0].openning >= hourBase) { + } else if (new Date('1/1/1999 ' + period.time[0].openning) > currentHour) { return new OpeningDay(i, this.numberToHour(period.time[0].openning)); - } else if (period.time[1] && period.time[1].openning >= hourBase) { + } else if (period.time[1] && new Date('1/1/1999 ' + period.time[1].openning) > currentHour) { return new OpeningDay(i, this.numberToHour(period.time[1].openning)); } // Return the next day > current day. @@ -181,23 +186,18 @@ export class StructureService { return Weekday[n]; } - private numberToHour(n: number): string { - if (n.toString().length === 3) { - const tabNum = n.toString().match(/.{1,1}/g); - return tabNum[0] + 'h' + tabNum[1] + tabNum[2]; - } else if (n.toString().length === 4) { - const tabNum = n.toString().match(/.{1,2}/g); - return tabNum[0] + 'h' + tabNum[1]; - } + private numberToHour(n: string): string { + return n.replace(':', 'h'); } + public getStructureWithOwners(structureId: string, profile: User): Observable { return this.http.post(`${this.baseUrl}/${structureId}/withOwners`, { emailUser: profile.email }); } - public sendMailOnStructureError(structureId: string, content: string, profile: User) { + public sendMailOnStructureError(structureId: string, content: string): Observable { return this.http.post(`${this.baseUrl}/reportStructureError`, { structureId, - content: content, + content, }); } } diff --git a/src/app/shared/components/hour-picker/hour-picker.component.ts b/src/app/shared/components/hour-picker/hour-picker.component.ts index 43c40115..ee97a1e4 100644 --- a/src/app/shared/components/hour-picker/hour-picker.component.ts +++ b/src/app/shared/components/hour-picker/hour-picker.component.ts @@ -97,21 +97,21 @@ export class HourPickerComponent implements OnChanges, OnDestroy { .map((hour: Time) => { if (hour.openning && hour.closing) { return { - start: this.formatNumericalHours(hour.openning), - end: this.formatNumericalHours(hour.closing), + start: hour.openning, + end: hour.closing, error: null, }; } else { if (hour.openning) { return { - start: this.formatNumericalHours(hour.openning), + start: hour.openning, end: '', error: 'incomplete', }; } else { return { start: '', - end: this.formatNumericalHours(hour.closing), + end: hour.closing, error: 'incomplete', }; } @@ -135,8 +135,8 @@ export class HourPickerComponent implements OnChanges, OnDestroy { time: data.hours.map( (hour) => new Time({ - openning: this.formatStringHours(hour.start), - closing: this.formatStringHours(hour.end), + openning: hour.start, + closing: hour.end, }) ), }); @@ -154,27 +154,6 @@ export class HourPickerComponent implements OnChanges, OnDestroy { }); } - /** - * convert 1300 to '13:00' - */ - private formatNumericalHours(hour: number): string { - const numberStr = hour.toString(); - if (numberStr.length === 3) { - return `0${numberStr[0]}:${numberStr[1]}${numberStr[2]}`; - } else { - const splitStr = numberStr.match(/.{1,2}/g); - return `${splitStr[0]}:${splitStr[1]}`; - } - } - - /** - * convert '13:00' to 1300 - */ - private formatStringHours(hour: string): number { - const numberStr = hour.split(':')[0] + hour.split(':')[1]; - return parseInt(numberStr); - } - /** * Intégrer les horaires dans les horaires par défaut du composant */ diff --git a/src/app/shared/validator/form.ts b/src/app/shared/validator/form.ts index b07e6986..e4f88da4 100644 --- a/src/app/shared/validator/form.ts +++ b/src/app/shared/validator/form.ts @@ -15,10 +15,10 @@ export function MustMatch(controlName: string, matchingControlName: string): any }; } -export function CheckHours(openning: number) { +export function CheckHours(openning: string) { return (control: AbstractControl) => { - const regex = new RegExp('^[0-9]*$'); - if (regex.test(control.value) && openning < control.value) { + const regex = new RegExp('([0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]'); + if (regex.test(control.value) && new Date('1/1/1999 ' + openning) < new Date('1/1/1999 ' + control.value)) { return null; } else { return { forbiddenName: { value: control.value } }; diff --git a/src/app/structure-list/components/structure-details/structure-details.component.ts b/src/app/structure-list/components/structure-details/structure-details.component.ts index 0382434a..5f51fc31 100644 --- a/src/app/structure-list/components/structure-details/structure-details.component.ts +++ b/src/app/structure-list/components/structure-details/structure-details.component.ts @@ -300,16 +300,13 @@ export class StructureDetailsComponent implements OnInit { } public displayModalError(): void { - //do we need to check for user is logged ? this.structureErrorModalOpenned = !this.structureErrorModalOpenned; } public sendErrorEmail(modalValue: any): void { this.displayModalError(); if (modalValue.shouldSend) { - this.structureService - .sendMailOnStructureError(this.structure._id, modalValue.content, this.currentProfile) - .subscribe(() => {}); + this.structureService.sendMailOnStructureError(this.structure._id, modalValue.content).subscribe(() => {}); } } } -- GitLab From 34609fb0751d31dd45230c028193f7d1a1e11640 Mon Sep 17 00:00:00 2001 From: Antonin COQUET Date: Mon, 26 Apr 2021 14:35:41 +0200 Subject: [PATCH 11/30] feat: ghost css display --- .../post-details/post-details.component.scss | 103 +++++++++++++++++- 1 file changed, 98 insertions(+), 5 deletions(-) diff --git a/src/app/post/components/post-details/post-details.component.scss b/src/app/post/components/post-details/post-details.component.scss index 27e6544e..3b330bd2 100644 --- a/src/app/post/components/post-details/post-details.component.scss +++ b/src/app/post/components/post-details/post-details.component.scss @@ -56,19 +56,112 @@ $margin-post: 20px; .description { div { width: 100%; + line-height: 180%; } ::ng-deep figure { margin: 0; - img { - object-fit: cover; - max-width: 100%; - } } ::ng-deep a { @include hyperlink; padding: 0; } ::ng-deep p { - @include cn-regular-18; + @include cn-regular-16; + } + ::ng-deep li { + @include cn-regular-16; + margin-bottom: 10px; + } + ::ng-deep h2 { + margin-top: 50px; + } + ::ng-deep blockquote { + margin: 1.5em 0; + padding: 0 1.6em; + border-left: 3px solid $blue; + } + ::ng-deep .kg-image-card { + margin: 0 auto; + max-width: 100%; + ::ng-deep .kg-image { + max-width: 100%; + margin-top: 10px; + display: block; + margin-left: auto; + margin-right: auto; + } + } + ::ng-deep .kg-bookmark-card { + margin-top: 30px; + font: inherit; + vertical-align: baseline; + ::ng-deep .kg-bookmark-container { + display: flex; + border-radius: 3px; + color: var(--darkgrey); + text-decoration: none; + box-shadow: 0 2px 5px -1px rgb(0 0 0 / 15%), 0 0 1px rgb(0 0 0 / 9%); + ::ng-deep .kg-bookmark-content { + flex-grow: 1; + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: flex-start; + padding: 20px; + ::ng-deep .kg-bookmark-title { + color: $grey-1; + @include cn-regular-18; + } + ::ng-deep .kg-bookmark-description { + display: -webkit-box; + overflow-y: hidden; + margin-top: 12px; + max-height: 48px; + color: $grey-2; + line-height: 1.5em; + font-weight: 400; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + ::ng-deep .kg-bookmark-metadata { + display: flex; + flex-wrap: wrap; + align-items: center; + margin-top: 14px; + color: var(--darkgrey); + font-weight: 500; + ::ng-deep .kg-bookmark-icon { + margin-right: 8px; + width: 22px; + height: 22px; + display: block; + } + ::ng-deep .kg-bookmark-author { + line-height: 1.5em; + @include cn-regular-18; + } + ::ng-deep .kg-bookmark-publisher { + overflow: hidden; + line-height: 1.5em; + text-overflow: ellipsis; + white-space: nowrap; + color: $grey-2; + } + } + } + ::ng-deep .kg-bookmark-thumbnail { + position: relative; + min-width: 33%; + max-height: 100%; + img { + position: absolute; + width: 100%; + height: 100%; + border-radius: 0 3px 3px 0; + -o-object-fit: cover; + object-fit: cover; + } + } + } } } -- GitLab From d01ad9532ba9d50ae1ebf26443f242ce8636dbd0 Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Tue, 27 Apr 2021 11:37:53 +0200 Subject: [PATCH 12/30] feat: add count on newsletter and change button --- .../newsletter-users/newsletter-users.component.html | 1 + .../newsletter-users/newsletter-users.component.ts | 7 +++++++ src/app/admin/components/panel/panel.component.html | 3 +-- src/app/admin/services/admin.service.ts | 4 ++++ 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/app/admin/components/newsletter-users/newsletter-users.component.html b/src/app/admin/components/newsletter-users/newsletter-users.component.html index 8a82446d..d89d280e 100644 --- a/src/app/admin/components/newsletter-users/newsletter-users.component.html +++ b/src/app/admin/components/newsletter-users/newsletter-users.component.html @@ -3,6 +3,7 @@
+
Il y a actuellement {{ subscriptionsCount }} abonnés à la newsletter.
diff --git a/src/app/admin/components/newsletter-users/newsletter-users.component.ts b/src/app/admin/components/newsletter-users/newsletter-users.component.ts index 66290faa..6eab37d7 100644 --- a/src/app/admin/components/newsletter-users/newsletter-users.component.ts +++ b/src/app/admin/components/newsletter-users/newsletter-users.component.ts @@ -10,9 +10,16 @@ export class NewsletterUsersComponent { public subscriptions: NewsletterSubscription[]; public deleteModalOpenned = false; public emailToUnsubscribe: string = null; + public subscriptionsCount: number = 0; constructor(private adminService: AdminService) {} + ngOnInit(): void { + this.adminService.countNewsletterSubscriptions().subscribe((count) => { + this.subscriptionsCount = count; + }); + } + public toggleUnsubscribeModal(emailToUnsubscribe: string): void { this.emailToUnsubscribe = emailToUnsubscribe; this.deleteModalOpenned = !this.deleteModalOpenned; diff --git a/src/app/admin/components/panel/panel.component.html b/src/app/admin/components/panel/panel.component.html index 1ee88741..c9228138 100644 --- a/src/app/admin/components/panel/panel.component.html +++ b/src/app/admin/components/panel/panel.component.html @@ -3,7 +3,7 @@
- + Ghost
@@ -15,5 +15,4 @@
-
diff --git a/src/app/admin/services/admin.service.ts b/src/app/admin/services/admin.service.ts index d71c89ef..7e50a650 100644 --- a/src/app/admin/services/admin.service.ts +++ b/src/app/admin/services/admin.service.ts @@ -33,6 +33,10 @@ export class AdminService { return this.http.post(`api/admin/searchNewsletterSubscriptions`, { searchString }); } + public countNewsletterSubscriptions(): Observable { + return this.http.get(`api/admin/countNewsletterSubscriptions`); + } + public unsubscribeEmail(email: string): Observable { return this.http.delete(`api/admin/newsletterSubscription/` + email); } -- GitLab From 88216e5f2dc86465de9f06df1576ab20547f9fe4 Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Wed, 28 Apr 2021 15:14:53 +0200 Subject: [PATCH 13/30] feat: regex web + precision horaire + placeholder (ticket 496/497/500) --- src/app/form/form.component.html | 9 +++--- src/app/form/form.component.scss | 4 +++ src/app/form/form.component.ts | 7 ++--- src/app/form/pageType.enum.ts | 29 +++++++++---------- .../reset-password.component.html | 20 +++++++------ .../create-account-form.component.html | 2 +- .../signup-modal/signup-modal.component.html | 2 +- src/app/utils/CustomRegExp.ts | 2 +- 8 files changed, 39 insertions(+), 36 deletions(-) diff --git a/src/app/form/form.component.html b/src/app/form/form.component.html index c32ffbbf..f50fc2e1 100644 --- a/src/app/form/form.component.html +++ b/src/app/form/form.component.html @@ -186,7 +186,7 @@

Quels identifiants utiliserez-vous pour vous connecter ?

- +

L'email est déja utilisé.

@@ -196,6 +196,7 @@ (input)="setValidationsForm()" (keyup)="verifyUserExist($event.target.value)" formControlName="email" + placeholder="thomas@grandlyon.com" class="form-input" [readonly]="isAccountMode" [ngClass]="{ disabled: isAccountMode }" @@ -416,9 +417,7 @@ (updateFormError)="setHoursError()" [structureInput]="hoursForm" > -
-
-
+

Avez-vous des précisions à apporter sur les horaires ?

facultatif

@@ -472,7 +471,7 @@
Réinitialisation du mot de passe
- -
- -
+ +
+ +
-
L'adresse e-mail est requise
+
L'adresse e-mail est requise
diff --git a/src/app/shared/components/create-account-form/create-account-form.component.html b/src/app/shared/components/create-account-form/create-account-form.component.html index 6b547d7f..f515c148 100644 --- a/src/app/shared/components/create-account-form/create-account-form.component.html +++ b/src/app/shared/components/create-account-form/create-account-form.component.html @@ -1,6 +1,6 @@
- +
logo invalid diff --git a/src/app/shared/components/signup-modal/signup-modal.component.html b/src/app/shared/components/signup-modal/signup-modal.component.html index 492b39e2..caa8fd96 100644 --- a/src/app/shared/components/signup-modal/signup-modal.component.html +++ b/src/app/shared/components/signup-modal/signup-modal.component.html @@ -11,7 +11,7 @@

Se connecter

- +
-

Y a-t-il des informations spécifique à la période COVID ?

+

Y a-t-il des informations spécifiques à la période COVID ?

facultatif

diff --git a/src/app/form/form.component.ts b/src/app/form/form.component.ts index f98e30a3..9d4d64af 100644 --- a/src/app/form/form.component.ts +++ b/src/app/form/form.component.ts @@ -49,7 +49,7 @@ export class FormComponent implements OnInit { // Page and progress var public currentPage = 0; public progressStatus = 0; - public nbPagesForm = 24; + public nbPagesForm = 23; public isPageValid: boolean; public pagesValidation = []; @@ -280,7 +280,7 @@ export class FormComponent implements OnInit { Validators.required, Validators.pattern(CustomRegExp.NO_NULL_NUMBER), ]), - freeWorkShop: new FormControl(structure.freeWorkShop, Validators.required), + freeWorkShop: new FormControl(structure.freeWorkShop), }); return form; } @@ -684,6 +684,22 @@ export class FormComponent implements OnInit { this.currentPage++; // page structureOtherAccompaniment skip and go to page structureWorkshop this.progressStatus += 100 / this.nbPagesForm; } + + if (this.currentPage == PageTypeEnum.structureWorkshop) { + //console.log('procedure:', this.proceduresAccompaniment.); + // console.log('public:', this..modules); + if ( + !this.structureForm.get('baseSkills').value.length && + !this.structureForm.get('accessRight').value.length && + !this.structureForm.get('parentingHelp').value.length && + !this.structureForm.get('socialAndProfessional').value.length && + !this.structureForm.get('digitalCultureSecurity').value.length + ) { + this.getStructureControl('freeWorkShop').reset(); + this.currentPage++; + this.progressStatus += 100 / this.nbPagesForm; + } + } // Check if going to the last page to submit form and send email verification. if (this.currentPage == this.nbPagesForm - 1) { this.validateForm(); @@ -711,6 +727,20 @@ export class FormComponent implements OnInit { this.currentPage--; // page 14 skip and go to page 13 this.progressStatus -= 100 / this.nbPagesForm; } + if (this.currentPage == PageTypeEnum.structureWifi) { + //console.log('procedure:', this.proceduresAccompaniment.); + // console.log('public:', this..modules); + if ( + !this.structureForm.get('baseSkills').value.length && + !this.structureForm.get('accessRight').value.length && + !this.structureForm.get('parentingHelp').value.length && + !this.structureForm.get('socialAndProfessional').value.length && + !this.structureForm.get('digitalCultureSecurity').value.length + ) { + this.currentPage--; + this.progressStatus -= 100 / this.nbPagesForm; + } + } this.currentPage--; this.progressStatus -= 100 / this.nbPagesForm; this.updatePageValid(); diff --git a/src/app/form/pageType.enum.ts b/src/app/form/pageType.enum.ts index fbe238d6..708f64b1 100644 --- a/src/app/form/pageType.enum.ts +++ b/src/app/form/pageType.enum.ts @@ -18,7 +18,7 @@ export enum PageTypeEnum { structureWifi = 16, structureEquipments = 17, structureLabels = 18, - structureOtherServices = 29, + structureOtherServices = 19, structureDescription = 20, structureCovidInfo = 21, cgu = 22, -- GitLab From 16146f2aabf39c28edf42e062328d8bf6bbbb5fa Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Thu, 29 Apr 2021 14:21:06 +0200 Subject: [PATCH 16/30] fix: changes after review --- .../newsletter-users/newsletter-users.component.ts | 1 + src/app/admin/services/admin.service.ts | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/app/admin/components/newsletter-users/newsletter-users.component.ts b/src/app/admin/components/newsletter-users/newsletter-users.component.ts index 6eab37d7..2b867516 100644 --- a/src/app/admin/components/newsletter-users/newsletter-users.component.ts +++ b/src/app/admin/components/newsletter-users/newsletter-users.component.ts @@ -36,6 +36,7 @@ export class NewsletterUsersComponent { if (shouldUnsubscribe) { this.adminService.unsubscribeEmail(email).subscribe((data) => { this.subscriptions = this.subscriptions.filter((obj) => obj.email !== email); + this.subscriptionsCount = this.subscriptions.length; }); } } diff --git a/src/app/admin/services/admin.service.ts b/src/app/admin/services/admin.service.ts index 7e50a650..85b41d25 100644 --- a/src/app/admin/services/admin.service.ts +++ b/src/app/admin/services/admin.service.ts @@ -22,23 +22,23 @@ export class AdminService { } public searchUsers(searchString: string): Observable { - return this.http.post(`api/admin/searchUsers`, { searchString }); + return this.http.post(`${this.baseUrl}/searchUsers`, { searchString }); } public deleteUser(id: string): Observable { - return this.http.delete(`api/admin/user/` + id); + return this.http.delete(`${this.baseUrl}/user/` + id); } public searchNewsletterSubscriptions(searchString: string): Observable { - return this.http.post(`api/admin/searchNewsletterSubscriptions`, { searchString }); + return this.http.post(`${this.baseUrl}/searchNewsletterSubscriptions`, { searchString }); } public countNewsletterSubscriptions(): Observable { - return this.http.get(`api/admin/countNewsletterSubscriptions`); + return this.http.get(`${this.baseUrl}/countNewsletterSubscriptions`); } public unsubscribeEmail(email: string): Observable { - return this.http.delete(`api/admin/newsletterSubscription/` + email); + return this.http.delete(`${this.baseUrl}/newsletterSubscription/` + email); } public acceptStructureClaim( -- GitLab From 2ef36f46abec6010b4c1e8ec6fea8fe0c166d0e8 Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Thu, 29 Apr 2021 17:14:25 +0200 Subject: [PATCH 17/30] WIP: login on structure form --- src/app/form/form.component.html | 12 ++++++++++++ src/app/form/form.component.ts | 24 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/app/form/form.component.html b/src/app/form/form.component.html index 279e2672..a96763da 100644 --- a/src/app/form/form.component.html +++ b/src/app/form/form.component.html @@ -121,6 +121,13 @@

Qui êtes-vous ?

Ces informations ne seront pas visibles sur la plateforme

+
+

Vous possédez déja un compte ? Connectez-vous:

+ +

Sinon, inscrivez-vous en suivant le formulaire ci-dessous:

+
@@ -1213,4 +1220,9 @@ Voir ma structure
+
diff --git a/src/app/form/form.component.ts b/src/app/form/form.component.ts index 9d4d64af..6051a253 100644 --- a/src/app/form/form.component.ts +++ b/src/app/form/form.component.ts @@ -77,6 +77,9 @@ export class FormComponent implements OnInit { public isWifiChoosen = null; public structureWithOwners: StructureWithOwners; + public isPopUpOpen = false; + public displaySignUp = true; + constructor( private structureService: StructureService, private searchService: SearchService, @@ -138,6 +141,27 @@ export class FormComponent implements OnInit { } } + public closeSignUpModal(value: boolean): void { + if (!value) { + this.displaySignUp = false; + } else { + this.isPopUpOpen = false; + } + if (this.isLoggedIn) { + this.updateFormOnLogin(); + } + } + + public updateFormOnLogin() { + //TODO -> switch to signed mode, update user data, validate/delete previous field, skip 2 pages + this.isAccountMode = true; + this.currentPage = PageTypeEnum.structureNameAndAddress; + } + + public get isLoggedIn(): boolean { + return this.authService.isLoggedIn(); + } + async setCategories(): Promise { this.searchService.getCategoriesAccompaniment().subscribe((categories: Category[]) => { this.proceduresAccompaniment = categories[0]; -- GitLab From 4e7ee0722a28f66e2a9f0f5d14805d107fe5920a Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Fri, 30 Apr 2021 11:16:31 +0200 Subject: [PATCH 18/30] feat: allow connexion from structure form --- src/app/form/form.component.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/app/form/form.component.ts b/src/app/form/form.component.ts index 6051a253..e0367bf0 100644 --- a/src/app/form/form.component.ts +++ b/src/app/form/form.component.ts @@ -153,8 +153,12 @@ export class FormComponent implements OnInit { } public updateFormOnLogin() { - //TODO -> switch to signed mode, update user data, validate/delete previous field, skip 2 pages - this.isAccountMode = true; + this.profileService.getProfile().then((user: User) => { + this.profile = user; + }); + this.router.navigateByUrl('create-structure'); + this.pagesValidation[PageTypeEnum.accountInfo] = { valid: true }; + this.pagesValidation[PageTypeEnum.accountCredentials] = { valid: true }; this.currentPage = PageTypeEnum.structureNameAndAddress; } -- GitLab From 37d049f6fc23c0e85a5cb13b60c8a53c9096a17d Mon Sep 17 00:00:00 2001 From: Hugo SUBTIL Date: Fri, 30 Apr 2021 14:51:08 +0200 Subject: [PATCH 19/30] fix: map locate causing search issue --- src/app/map/components/map.component.ts | 1 - .../structure-list-search.component.ts | 26 ++----------------- 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/src/app/map/components/map.component.ts b/src/app/map/components/map.component.ts index 61da5c52..9ca53b19 100644 --- a/src/app/map/components/map.component.ts +++ b/src/app/map/components/map.component.ts @@ -193,7 +193,6 @@ export class MapComponent implements OnChanges { this.map = map; // Handle location this.lc = L.control.locate(this.locateOptions).addTo(this.map); - // .locate(this.locateOptions).addTo(this.map); this.map.on('locationfound', () => { this.locatationTrigger.emit(true); }); diff --git a/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts b/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts index e3892686..b84aafe9 100644 --- a/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts +++ b/src/app/structure-list/components/structure-list-search/structure-list-search.component.ts @@ -1,7 +1,6 @@ -import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { FormBuilder, FormGroup } from '@angular/forms'; import { forkJoin } from 'rxjs'; -import { GeoJson } from '../../../map/models/geojson.model'; import { GeojsonService } from '../../../services/geojson.service'; import { TypeModal } from '../../enum/typeModal.enum'; import { Category } from '../../models/category.model'; @@ -17,7 +16,7 @@ import { ActivatedRoute, Router } from '@angular/router'; templateUrl: './structure-list-search.component.html', styleUrls: ['./structure-list-search.component.scss'], }) -export class StructureListSearchComponent implements OnInit, OnChanges { +export class StructureListSearchComponent implements OnInit { @Output() searchEvent = new EventEmitter(); // Show/hide form createStructure @@ -47,9 +46,7 @@ export class StructureListSearchComponent implements OnInit, OnChanges { constructor( public searchService: SearchService, private fb: FormBuilder, - private geoJsonService: GeojsonService, private activatedRoute: ActivatedRoute, - private location: Location, private route: ActivatedRoute, private router: Router ) { @@ -69,12 +66,6 @@ export class StructureListSearchComponent implements OnInit, OnChanges { } } - ngOnChanges(changes: SimpleChanges): void { - if (changes.locate && changes.locate.currentValue && !changes.locate.previousValue) { - this.locateMe(); - } - } - // Accessor to template angular. public get TypeModal(): typeof TypeModal { return TypeModal; @@ -173,19 +164,6 @@ export class StructureListSearchComponent implements OnInit, OnChanges { this.modalTypeOpened = undefined; } - // Get adress and put it in input - public locateMe(): void { - navigator.geolocation.getCurrentPosition((position) => { - const longitude = position.coords.longitude; - const latitude = position.coords.latitude; - this.geoJsonService.getAddressByCoord(longitude, latitude).subscribe((geoPosition: GeoJson) => { - const adress = geoPosition.properties.name; - this.searchForm.setValue({ searchTerm: adress }); - this.applyFilter(adress); - }); - this.locatationTrigger.emit(true); - }); - } // Management of the checkbox event (Check / Uncheck) public numericPassCheck(event, categ): void { const checkValue: string = event.target.value; -- GitLab From 66287ff7c54a670fdfc688a80d998087e90f4799 Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Fri, 30 Apr 2021 17:20:11 +0200 Subject: [PATCH 20/30] fix: changes after review --- src/app/form/form.component.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/app/form/form.component.ts b/src/app/form/form.component.ts index e0367bf0..74de6743 100644 --- a/src/app/form/form.component.ts +++ b/src/app/form/form.component.ts @@ -157,6 +157,7 @@ export class FormComponent implements OnInit { this.profile = user; }); this.router.navigateByUrl('create-structure'); + this.progressStatus += (100 / this.nbPagesForm) * 2; this.pagesValidation[PageTypeEnum.accountInfo] = { valid: true }; this.pagesValidation[PageTypeEnum.accountCredentials] = { valid: true }; this.currentPage = PageTypeEnum.structureNameAndAddress; @@ -714,8 +715,6 @@ export class FormComponent implements OnInit { } if (this.currentPage == PageTypeEnum.structureWorkshop) { - //console.log('procedure:', this.proceduresAccompaniment.); - // console.log('public:', this..modules); if ( !this.structureForm.get('baseSkills').value.length && !this.structureForm.get('accessRight').value.length && @@ -756,8 +755,6 @@ export class FormComponent implements OnInit { this.progressStatus -= 100 / this.nbPagesForm; } if (this.currentPage == PageTypeEnum.structureWifi) { - //console.log('procedure:', this.proceduresAccompaniment.); - // console.log('public:', this..modules); if ( !this.structureForm.get('baseSkills').value.length && !this.structureForm.get('accessRight').value.length && -- GitLab From 538e99674b24a48d209f8c1bac34be218f9e376b Mon Sep 17 00:00:00 2001 From: Antonin Coquet Date: Mon, 3 May 2021 14:12:57 +0200 Subject: [PATCH 21/30] feat: add a loader gif on news loadding --- .../post-list/post-list.component.html | 7 +++++-- .../post-list/post-list.component.scss | 9 +++++++++ src/assets/gif/loader_circle.gif | Bin 0 -> 92196 bytes 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 src/assets/gif/loader_circle.gif diff --git a/src/app/post/components/post-list/post-list.component.html b/src/app/post/components/post-list/post-list.component.html index 2d6c1559..c5577e7c 100644 --- a/src/app/post/components/post-list/post-list.component.html +++ b/src/app/post/components/post-list/post-list.component.html @@ -1,5 +1,8 @@
-
+
+ +
+
-
+
diff --git a/src/app/post/components/post-list/post-list.component.scss b/src/app/post/components/post-list/post-list.component.scss index 43d3381e..a4b61284 100644 --- a/src/app/post/components/post-list/post-list.component.scss +++ b/src/app/post/components/post-list/post-list.component.scss @@ -3,6 +3,15 @@ @import '../../../../assets/scss/shapes'; @import '../../../../assets/scss/breakpoint'; +.loader { + width: 100%; + text-align: center; + .loader-gif { + min-width: 10%; + min-height: 10%; + } +} + .section-container { background: $grey-6; min-height: 68vh; diff --git a/src/assets/gif/loader_circle.gif b/src/assets/gif/loader_circle.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6e6ff141451ac14ade4b62c97c353fa0b31faf1 GIT binary patch literal 92196 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 Gf&T$}Clze~ literal 0 HcmV?d00001 -- GitLab From 606b5b8e5852f46d6231ef0a28f509f1e6566534 Mon Sep 17 00:00:00 2001 From: Hugo SUBTIL Date: Tue, 4 May 2021 16:12:43 +0200 Subject: [PATCH 22/30] feat: add robots.txt and sitemap --- angular.json | 2 ++ src/app/about/about.component.html | 8 +++---- src/app/header/header.component.html | 11 +++++++-- src/robots.txt | 3 +++ src/sitemap.xml | 34 ++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 src/robots.txt create mode 100644 src/sitemap.xml diff --git a/angular.json b/angular.json index 962c5cd1..f81319cf 100644 --- a/angular.json +++ b/angular.json @@ -39,6 +39,8 @@ "assets": [ "src/favicon.ico", "src/assets", + "src/sitemap.xml", + "src/robots.txt", { "glob": "**/*", "input": "./node_modules/leaflet/dist/images", diff --git a/src/app/about/about.component.html b/src/app/about/about.component.html index fcbc5f03..678e0577 100644 --- a/src/app/about/about.component.html +++ b/src/app/about/about.component.html @@ -19,9 +19,9 @@ services ont été identifiées :

Recenser et partager des ressources existantes (optimisation)

- illustration des besoins + illustration des besoins

Co-construire de nouvelles ressources (développement)

- illustration des besoins + illustration des besoins

Cet espace vise à centraliser et mettre en commun les ressources développées dans le cadre du réseau par ses acteurs. @@ -29,8 +29,8 @@

N'hésitez pas à contribuer à cet espace en partageant vos ressources

- logo de l'union européenne - logo de la région Auverge-Rhône-Alpes + logo de l'union européenne + logo de la région Auverge-Rhône-Alpes
diff --git a/src/app/header/header.component.html b/src/app/header/header.component.html index d8557009..eafd0627 100644 --- a/src/app/header/header.component.html +++ b/src/app/header/header.component.html @@ -1,6 +1,13 @@