Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • web-et-numerique/factory/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client
1 result
Show changes
Commits on Source (2)
Showing
with 244 additions and 45 deletions
......@@ -32,7 +32,6 @@ import { StructureHoursComponent } from './structure-form/structure-hours/struct
import { StructureLabelsComponent } from './structure-form/structure-labels/structure-labels.component';
import { StructureNameAndAddressComponent } from './structure-form/structure-name-and-address/structure-name-and-address.component';
import { structureDigitalHelpingAccompanimentOtherComponent } from './structure-form/structure-public-target-other/structure-public-target-other.component';
import { StructurePublicTargetComponent } from './structure-form/structure-public-target/structure-public-target.component';
import { StructureTrainingPriceComponent } from './structure-form/structure-training-price/structure-training-price.component';
import { StructureTrainingTypeComponent } from './structure-form/structure-training-type/structure-training-type.component';
import { StructureTypeComponent } from './structure-form/structure-type/structure-type.component';
......@@ -61,7 +60,6 @@ import { StructureSolidarityMaterialComponent } from './structure-form/structure
StructureAccessModalityComponent,
StructureHoursComponent,
StructureWebAndSocialNetworkComponent,
StructurePublicTargetComponent,
structureDigitalHelpingAccompanimentOtherComponent,
StructureDigitalHelpingAccompanimentComponent,
StructureTrainingPriceComponent,
......
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';
import { UntypedFormGroup } from '@angular/forms';
import { ButtonType } from '../../../../shared/components/button/buttonType.enum';
import { Category } from '../../../../structure-list/models/category.model';
......@@ -7,7 +7,7 @@ import { Category } from '../../../../structure-list/models/category.model';
selector: 'app-structure-public-target',
templateUrl: './structure-public-target.component.html',
})
export class StructurePublicTargetComponent implements OnInit {
export class StructurePublicTargetComponent implements OnInit, OnChanges {
@Input() structureForm: UntypedFormGroup;
@Input() age: Category;
@Input() languageAndIlliteracy: Category;
......@@ -23,6 +23,9 @@ export class StructurePublicTargetComponent implements OnInit {
ngOnInit(): void {
this.validateForm.emit();
}
ngOnChanges(changes: SimpleChanges): void {
if (changes.isMandatoryFields) this.validateForm.emit();
}
public updateChoicePublic(choice: string, formControlName: string) {
this.updateChoice.emit({ formControlName: `categories.${formControlName}`, choice });
......
export enum MeetingRDVSSteps {
structureOrientator,
publicTypeMandatory,
publicTypeOptional,
pmrAccess,
digitalPass,
location,
rdvsDoing,
//Maybe replace callback page with lodaer on recap
rdvsCallback,
recap,
}
export enum OnlineDemarchesMeetingSteps {
structureOrientator,
publicType,
pmrAccess,
digitalPass,
location,
}
......@@ -4,8 +4,8 @@
<h3>Orienté par</h3>
<div class="content">
<div class="infos">{{ orientator.structureName }}</div>
<div class="infos">{{ orientator.structureMail }}</div>
<div class="infos">{{ orientator.structurePhone }}</div>
<div class="infos" *ngIf="orientator.structureMail">{{ orientator.structureMail }}</div>
<div class="infos" *ngIf="orientator.structurePhone">{{ orientator.structurePhone }}</div>
</div>
</div>
<div class="beneficiary header">
......
......@@ -48,7 +48,7 @@ export class MediationRecapComponent implements OnInit {
}
public isOrientator(): boolean {
return this.orientator?.structureMail ? true : false;
return this.orientator?.structureName ? true : false;
}
public handleOnlineMediationRecap(): void {
......
<div class="footerForm" fxLayout="row" fxLayoutGap="10px" fxLayoutAlign="center center">
<app-button
*ngIf="currentStep !== null"
(action)="prevPage()"
[text]="'Précédent'"
[iconType]="'form'"
[iconBtn]="'chevronLeft'"
></app-button>
<app-button
(action)="nextPage()"
[text]="isLastStep ? 'Terminer' : 'Suivant'"
[iconBtn]="!isLastStep ? 'chevronRight' : 'finish'"
[iconType]="'form'"
[iconPos]="!isLastStep ? 'right' : 'left'"
[style]="buttonTypeEnum.Primary"
[disabled]="!isPageValid"
>
</app-button>
<ng-container *ngIf="!shouldResetOrientation">
<app-button
*ngIf="currentStep !== null && !hideNavButtons"
(action)="prevPage()"
[text]="'Précédent'"
[iconType]="'form'"
[iconBtn]="'chevronLeft'"
></app-button>
<app-button
*ngIf="!isRdvsWindowStep && !hideNavButtons"
(action)="nextPage()"
[text]="isLastStep ? 'Terminer' : 'Suivant'"
[iconBtn]="!isLastStep ? 'chevronRight' : 'finish'"
[iconType]="'form'"
[iconPos]="!isLastStep ? 'right' : 'left'"
[style]="buttonTypeEnum.Primary"
[disabled]="!isPageValid"
>
</app-button>
<app-button
*ngIf="isRdvsWindowStep && !hideNavButtons"
(action)="nextPage()"
[text]="'RDV Solidarités'"
[iconBtn]="'redirect'"
[iconType]="'form'"
[iconPos]="'left'"
[style]="buttonTypeEnum.RdvsButton"
[disabled]="!isPageValid"
>
</app-button>
</ng-container>
<ng-container *ngIf="shouldResetOrientation">
<app-button (action)="goCarto()" [text]="'Aller à la cartographie'"> </app-button>
<app-button (action)="resetOrientation()" [text]="'Recommencer'" [style]="buttonTypeEnum.Primary"> </app-button>
</ng-container>
</div>
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { ButtonType } from '../../../../shared/components/button/buttonType.enum';
import { NeedsType } from '../../enums/needs.enum';
import { OnlineDemarche } from '../../enums/onlineDemarche.enum';
......@@ -15,12 +16,16 @@ export class NavigationComponent {
@Input() isPageValid: boolean;
@Input() needType: NeedsType;
@Input() isLastStep = false;
@Input() isRdvsWindowStep = false;
@Input() hideNavButtons = false;
@Input() shouldResetOrientation = false;
@Output() goNext = new EventEmitter<any>();
@Output() goPrev = new EventEmitter<any>();
public buttonTypeEnum = ButtonType;
public NeedsTypeEnum = NeedsType;
constructor(private router: Router, private route: ActivatedRoute) {}
public nextPage(isPrint?: boolean) {
this.goNext.emit(isPrint);
}
......@@ -28,4 +33,12 @@ export class NavigationComponent {
public prevPage() {
this.goPrev.emit();
}
public goCarto(): void {
this.router.navigateByUrl('/acteurs');
}
public resetOrientation(): void {
this.router.routeReuseStrategy.shouldReuseRoute = () => false;
this.router.onSameUrlNavigation = 'reload';
this.router.navigate(['./'], { relativeTo: this.route });
}
}
......@@ -32,7 +32,7 @@
(input)="updatedForm('structureName', $event.target.value)"
/>
<app-svg-icon
*ngIf="form.get('structureName').valid"
*ngIf="form.get('structureName').value && form.get('structureName').valid"
[iconClass]="'validation'"
[type]="'form'"
[icon]="'validate'"
......@@ -78,7 +78,7 @@
type="phone"
autocomplete="on"
(input)="updatedForm('structurePhone', $event.target.value)"
formControlName="phone"
formControlName="structurePhone"
class="form-input"
/>
<app-svg-icon
......
......@@ -3,6 +3,7 @@ import { UntypedFormGroup } from '@angular/forms';
import { Structure } from '../../../../models/structure.model';
import { User } from '../../../../models/user.model';
import { StructureService } from '../../../../services/structure.service';
import { Utils } from '../../../../utils/utils';
@Component({
selector: 'app-structure-orientator',
......@@ -16,12 +17,12 @@ export class StructureOrientatorComponent implements OnInit {
public structuresLinked: Structure[] = [];
public hasStructures: boolean = false;
public selected: Structure;
constructor(private structureService: StructureService) {}
constructor(private structureService: StructureService, private utils: Utils) {}
ngOnInit(): void {
this.form = this.form.get('structureOrientator') as UntypedFormGroup;
if (this.profile?.structuresLink?.length) {
this.hasStructures = true;
for (let structure of this.profile.structuresLink) {
this.structureService
.getStructure(structure)
......@@ -34,11 +35,19 @@ export class StructureOrientatorComponent implements OnInit {
public select(structure: Structure): void {
this.selected = structure;
this.form.get('structureOrientator').patchValue({
this.form.patchValue({
structureName: structure.structureName,
structureMail: structure.contactMail,
structurePhone: structure.contactPhone,
});
this.validatePage.emit(this.form.get('structureOrientator').valid);
this.validatePage.emit(this.form.valid);
}
public updatedForm(field: string, value: string) {
if (field === 'phone') {
this.utils.modifyPhoneInput(this.form, 'phone', value);
} else this.form.get(field).patchValue(value);
this.validatePage.emit(this.form.valid);
}
}
import { FormControl, FormGroup, UntypedFormGroup } from '@angular/forms';
import { StructureOrientator } from './structureOrientator.interface';
export interface MeetingRDVSForm {
structureOrientator: FormGroup<StructureOrientator>;
categories: UntypedFormGroup;
pmrAccess: FormControl<boolean>;
digitalPass: FormControl<boolean>;
address: FormControl<string>;
onlineDemarcheType: FormControl<any>;
}
<form [formGroup]="form">
<div class="title">
<h3>Le bénéficiaire dispose-t-il de Pass numériques ?</h3>
<p>Facultatif</p>
</div>
<app-radio-form [selectedOption]="form.get('digitalPass').value" (selectedEvent)="handleChange($event)">
</app-radio-form>
</form>
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { UntypedFormGroup } from '@angular/forms';
@Component({
selector: 'app-meeting-digital-pass',
templateUrl: './meeting-digital-pass.component.html',
})
export class MeetingDigitalPassComponent implements OnInit {
@Input() form: UntypedFormGroup;
@Output() checkValidation = new EventEmitter<any>();
ngOnInit(): void {
this.checkValidation.emit();
}
public handleChange(val: boolean) {
this.form.get('digitalPass').patchValue(val);
this.checkValidation.emit();
}
public isSelected(): boolean {
return this.form.get('digitalPass').value;
}
}
<div class="container" *ngIf="!shouldReset">
<img src="../../../../../../assets/form/rdvsImage.svg" alt="rdvs illustration" />
<h2>Vous allez pouvoir prendre rendez-vous depuis RDV Solidarité.</h2>
<p>Ne fermez pas votre navigateur.</p>
</div>
<div class="container" *ngIf="shouldReset">
<img src="../../../../../../assets/form/rdvsImageNotFound.svg" alt="rdvs illustration" />
<h2>Aucune structure correspondant à votre recherche ne propose de rendez-vous</h2>
<p>Renouvellez votre recherche avec des critères différents ou accédez à la cartographie</p>
</div>
@import '../../../../../../assets/scss/typography';
.container {
display: flex;
flex-direction: column;
height: 100%;
align-items: center;
justify-content: center;
h2 {
@include lato-bold-24;
margin-bottom: 0;
margin-top: 1.5rem;
text-align: center;
max-width: 600px;
}
p {
@include lato-regular-24;
margin: 0 !important;
text-align: center;
max-width: 600px;
}
img {
width: 200px;
}
}
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { UntypedFormGroup } from '@angular/forms';
import { Structure } from '../../../../../models/structure.model';
import { NotificationService } from '../../../../../services/notification.service';
import { RdvsService } from '../../../../../services/rdvs.service';
import { StructureService } from '../../../../../services/structure.service';
import { Filter } from '../../../../../structure-list/models/filter.model';
import * as _ from 'lodash';
import { GeojsonService } from '../../../../../services/geojson.service';
@Component({
selector: 'app-meeting-rdvs-doing',
templateUrl: './meeting-rdvs-doing.component.html',
styleUrls: ['./meeting-rdvs-doing.component.scss'],
})
export class MeetingRdvsDoingComponent implements OnInit {
@Input() form: UntypedFormGroup;
public structureList: Structure[] = [];
public filters: Filter[] = [];
public shouldReset = false;
@Output() setResetOrientation = new EventEmitter();
constructor(
private structureService: StructureService,
private rdvsService: RdvsService,
private notificationService: NotificationService,
private geoJsonService: GeojsonService
) {}
ngOnInit(): void {
this.buildFilters();
if (this.form.get('address').value) {
const addresscoords: number[] = this.form.get('address').value.coordinates;
this.structureService.getStructures(this.filters, undefined, 20).subscribe((structures) => {
this.structureList = this.sortByDistance(structures, addresscoords);
});
} else {
this.structureService.getStructures(this.filters, undefined, 20).subscribe((structures) => {
this.structureList = structures;
});
}
if (!this.structureList.length) {
this.shouldReset = true;
this.setResetOrientation.emit();
return;
}
this.rdvsService.sendStructureArray(this.structureList).subscribe({
error: (e) => this.notificationService.showError(`${e.error.message}`, 'Une erreur est survenue'),
complete: () => window.open('https://www.rdv-aide-numerique.fr/public_api/public_links?territory=RVS'),
});
}
private buildFilters(): void {
const filters = [];
for (let [categ, moduleIdArray] of Object.entries(this.form.get('categories').value)) {
const idArray = moduleIdArray as string[];
if (idArray.length)
idArray.forEach((filterId: string) => {
filters.push(new Filter(categ, filterId));
});
}
if (this.form.get('pmrAccess').value) filters.push(new Filter('pmrAccess', this.form.get('pmrAccess').value));
if (this.form.get('digitalPass').value) filters.push(new Filter('labelsQualifications', 'passNumerique'));
filters.push(...this.form.get('onlineDemarcheType').value);
this.filters = filters;
}
private sortByDistance(structures: Structure[], addresscoords: number[]): Structure[] {
return structures.sort(
(a, b) =>
parseInt(this.geoJsonService.getDistance(a.getLat(), a.getLon(), addresscoords[1], addresscoords[0], 'M')) -
parseInt(this.geoJsonService.getDistance(b.getLat(), b.getLon(), addresscoords[1], addresscoords[0], 'M'))
);
}
}
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { UntypedFormGroup } from '@angular/forms';
import { INeedItem } from '../../../../utils/orientationUtils';
import { OnlineDemarche } from '../../enums/onlineDemarche.enum';
import { INeedItem } from '../../../../../utils/orientationUtils';
import { OnlineDemarche } from '../../../enums/onlineDemarche.enum';
@Component({
selector: 'app-accompaniment-type',
......@@ -18,11 +18,12 @@ export class AccompanimentTypeComponent implements OnInit {
hint: "Le bénéficiaire pourra prendre contact avec la structure ou s'y rendre directement",
key: OnlineDemarche.structureList,
},
{
title: 'Prendre RDV auprès d’un conseiller ou une conseillère numérique',
hint: 'Redirection vers RDV Aide Numérique pour voir les disponibilités',
key: OnlineDemarche.meetings,
},
//This step remains hidden until rdvs is ready to be integrated
// {
// title: 'Prendre RDV auprès d’un conseiller ou une conseillère numérique',
// hint: 'Redirection vers RDV Aide Numérique pour voir les disponibilités',
// key: OnlineDemarche.meetings,
// },
{
title: 'Choisir un créneau de médiation numérique à distance',
hint: 'Le bénéficiaire sera contacté par téléphone sur le créneau de son choix',
......
......@@ -21,6 +21,7 @@ export class OnlineDemarchComponent implements OnInit {
ngOnInit(): void {
this.selectedModules = this.form.get('onlineDemarcheType').value;
//TODO move this in form init categories
this.searchService.getCategories().subscribe((categories: Category[]) => {
this.accompanimentType = categories.find((el) => el.id === CategoryEnum.onlineProcedures).modules;
});
......