@dsivd/prestations-ng 18.2.4-beta.9 → 18.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,30 @@
6
6
 
7
7
  ---
8
8
 
9
+ ## [18.3.0] - should be aligned with prestations-be 18.3.x
10
+
11
+ ### Added
12
+
13
+ - [gesdem-action-recovery-login.component.ts](projects/prestations-ng/src/gesdem-action-recovery/gesdem-action-recovery-login/gesdem-action-recovery-login.component.ts)
14
+ - Display a countdown to get a new OTP during action recovery (to handle backend rate limiter)
15
+
16
+ ## [18.2.4]
17
+
18
+ ### Fixed
19
+
20
+ - [ApplicationInfo](projects/prestations-ng/src/sdk-appinfo/application-info.ts)
21
+
22
+ - fixed `getPortailBaseUrl` by adding a slash (`/`) at the end of url when missing in properties
23
+
24
+ ### Updated
25
+
26
+ - [foehn-form.component.ts](projects/prestations-ng/src/foehn-form/foehn-form.component.ts)
27
+
28
+ - updated `focusFirst` method with optional parameter `scrollIntoView` (default is `true`)
29
+
30
+ - [foehn-input.component.ts](projects/prestations-ng/src/foehn-input/foehn-input.component.ts)
31
+ - updated `focus` method with optional parameter `scrollIntoView` (default is `true`)
32
+
9
33
  ## [18.2.1]
10
34
 
11
35
  ### Fixed
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Optional, Inject, Injectable, EventEmitter, Input, HostBinding, Output, forwardRef, ViewChildren, ViewChild, Directive, Pipe, Component, ContentChildren, inject, HostListener, NgModule, TemplateRef, ContentChild } from '@angular/core';
2
+ import { Optional, Inject, Injectable, EventEmitter, Input, HostBinding, Output, forwardRef, ViewChildren, ViewChild, Directive, Pipe, Component, ContentChildren, HostListener, NgModule, inject, TemplateRef, ContentChild } from '@angular/core';
3
3
  import * as i1$1 from '@angular/router';
4
4
  import { ActivatedRoute, NavigationStart, RouterModule, NavigationEnd, RouterLink } from '@angular/router';
5
- import { of, Subject, BehaviorSubject, combineLatest, throwError, switchMap as switchMap$1, forkJoin, tap as tap$1, concat, toArray, EMPTY, startWith, filter as filter$1, merge, withLatestFrom, debounceTime as debounceTime$1, map as map$1 } from 'rxjs';
6
- import { map, shareReplay, filter, tap, debounceTime, catchError, switchMap, take, first, throttleTime, mergeMap, share, finalize, distinctUntilChanged } from 'rxjs/operators';
5
+ import { of, Subject, BehaviorSubject, combineLatest, throwError, switchMap as switchMap$1, forkJoin, tap as tap$1, concat, toArray, EMPTY, startWith, filter as filter$1, merge, interval, withLatestFrom, debounceTime as debounceTime$1, map as map$1 } from 'rxjs';
6
+ import { map, shareReplay, filter, tap, debounceTime, catchError, switchMap, first, throttleTime, mergeMap, share, finalize, take, distinctUntilChanged } from 'rxjs/operators';
7
7
  import * as i1 from '@angular/common/http';
8
- import { HttpStatusCode, HttpClient, HttpResponseBase, HttpErrorResponse, HttpParams, HttpEventType, HttpResponse, HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
8
+ import { HttpStatusCode, HttpResponseBase, HttpErrorResponse, HttpParams, HttpEventType, HttpResponse, HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi, HttpClient } from '@angular/common/http';
9
9
  import * as i3 from '@angular/forms';
10
10
  import { NgModel, NgForm, FormsModule } from '@angular/forms';
11
11
  import * as i2 from '@angular/common';
@@ -36,7 +36,6 @@ class Breadcrumb {
36
36
  }
37
37
 
38
38
  const SESSION_INFO_API_URL = 'api/sessionInfo/data';
39
- const SESSION_INFO_RENEW_URL = '/sessioninfo/v2/me';
40
39
  class SessionInfo {
41
40
  constructor(http, neverConnected_ = false) {
42
41
  this.http = http;
@@ -304,7 +303,7 @@ class ApplicationInfoService {
304
303
  getPortailBaseUrl(appInfo) {
305
304
  const baseUrl = appInfo.configuration?.portail?.baseUrl;
306
305
  if (!!baseUrl) {
307
- return baseUrl;
306
+ return baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
308
307
  }
309
308
  switch (appInfo.environment) {
310
309
  case 'CO':
@@ -885,35 +884,45 @@ class FoehnInputComponent {
885
884
  this._errors = errors.filter(e => e.name === this.name);
886
885
  }
887
886
  }
888
- focus() {
887
+ focus(scrollIntoView = true) {
889
888
  let elementContainer;
890
889
  if (this.inputElement && this.inputElement.nativeElement) {
891
890
  elementContainer = document.getElementById(this.buildId('Container'));
892
- // Scroll in view should be done on input container
893
- ScrollHelper.scrollIntoViewWithExpirationTimerOffset(elementContainer);
891
+ if (scrollIntoView) {
892
+ // Scroll in view should be done on input container
893
+ ScrollHelper.scrollIntoViewWithExpirationTimerOffset(elementContainer);
894
+ }
894
895
  // Focus should be on the input itself
895
- this.inputElement.nativeElement.focus();
896
+ this.inputElement.nativeElement.focus({
897
+ preventScroll: !scrollIntoView
898
+ });
896
899
  }
897
900
  else if (this.subComponents &&
898
901
  this.getFirstInputComponentEnabled(this.subComponents)) {
899
902
  const inputComponent = this.getFirstInputComponentEnabled(this.subComponents);
900
903
  elementContainer = document.getElementById(inputComponent.buildId('Container'));
901
- // Scroll in view should be done on input container
902
- ScrollHelper.scrollIntoViewWithExpirationTimerOffset(elementContainer);
904
+ if (scrollIntoView) {
905
+ // Scroll in view should be done on input container
906
+ ScrollHelper.scrollIntoViewWithExpirationTimerOffset(elementContainer);
907
+ }
903
908
  // Focus should be on the input itself
904
- inputComponent.inputElement.nativeElement.focus();
909
+ inputComponent.inputElement.nativeElement.focus({
910
+ preventScroll: !scrollIntoView
911
+ });
905
912
  }
906
913
  else {
907
914
  // Case for component who do not have any '#entryComponent' in their html template (i.e. foehn-radio, foehn-checkbox,...)
908
915
  elementContainer = document.getElementById(this.buildId('Container'));
909
- // Scroll in view should be done on input container
910
- ScrollHelper.scrollIntoViewWithExpirationTimerOffset(elementContainer);
916
+ if (scrollIntoView) {
917
+ // Scroll in view should be done on input container
918
+ ScrollHelper.scrollIntoViewWithExpirationTimerOffset(elementContainer);
919
+ }
911
920
  const elementNodeListOf = elementContainer.querySelectorAll(`input[id^="${this.name}"]`);
912
921
  if (elementNodeListOf && elementNodeListOf.length > 0) {
913
922
  const inputElement = this.findFirstHtmlInputElementEnabled(elementNodeListOf);
914
923
  if (inputElement) {
915
924
  // Focus should be on the input itself
916
- inputElement.focus();
925
+ inputElement.focus({ preventScroll: !scrollIntoView });
917
926
  }
918
927
  }
919
928
  }
@@ -1244,6 +1253,10 @@ const DEFAULT_DICTIONARY = {
1244
1253
  'gesdem-confirmation.resume-my-demand.label': 'Vous pouvez reprendre votre demande en cliquant sur le lien ci-dessous',
1245
1254
  'gesdem-confirmation.resume-my-demand.button': 'Reprendre ma demande',
1246
1255
  'gesdem.download-pdf.button.title': 'Télécharger le PDF',
1256
+ 'gesdem-action-recovery-login.request-now-code.label': 'Pour obtenir un nouveau code, vous devez recliquer sur le ' +
1257
+ '<a href="{redirectTarget}">lien</a> de reprise de la demande.\n',
1258
+ 'gesdem-action-recovery-login.rate-limited.label': "Merci d'attendre {rateLimitCounter} seconde{plural} " +
1259
+ 'pour demander un nouveau code.',
1247
1260
  'gesdem-action-recovery-login.save.label': 'Les données de votre demande enregistrée le {date} ont été chargées.',
1248
1261
  'gesdem-action-recovery-login.invalid-otp.label': "Le mot de passe saisi n'est pas valide",
1249
1262
  'gesdem-action-recovery-login.password-generation-failed.label': 'Impossible de générer un mot de passe, veuillez réessayer plus tard.',
@@ -1400,7 +1413,7 @@ const DEFAULT_DICTIONARY = {
1400
1413
  'gesdem-error.title.error': 'Erreur rencontrée',
1401
1414
  'gesdem-error.title.recovery': 'Reprise de la demande',
1402
1415
  'gesdem-error.text.wrong-etape-requested': 'La demande {reference} ne peut plus être modifiée via ce formulaire',
1403
- 'gesdem-error.text.demande-not-found': 'La demande {reference} a été supprimée',
1416
+ 'gesdem-error.text.demande-not-found': 'Les conditions préalables pour la reprise de cette demande ne sont pas remplies',
1404
1417
  'gesdem-error.text.has-reference': 'Vous pouvez essayer de reprendre votre demande en cliquant sur le lien ci-dessous',
1405
1418
  'gesdem-error.link.has-reference': 'Reprendre ma demande',
1406
1419
  'gesdem-error.text.has-no-reference': 'Vous pouvez recommencer une demande en cliquant sur le lien ci-dessous',
@@ -1822,14 +1835,14 @@ class FoehnFormComponent {
1822
1835
  }
1823
1836
  }
1824
1837
  }
1825
- focusFirst() {
1838
+ focusFirst(scrollIntoView = true) {
1826
1839
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1827
1840
  const allComponents = this.getAllComponents().filter(value => !value.disabled &&
1828
1841
  value.type !== 'hidden' &&
1829
1842
  !value.hidden &&
1830
1843
  !value.subComponents?.length);
1831
1844
  if (allComponents && allComponents.length > 0) {
1832
- allComponents[0].focus();
1845
+ allComponents[0].focus(scrollIntoView);
1833
1846
  }
1834
1847
  }
1835
1848
  focusErrorSummary() {
@@ -1911,8 +1924,6 @@ const isRedirectionToLogin = (event) => {
1911
1924
  };
1912
1925
  class IamExpiredInterceptorService {
1913
1926
  constructor() {
1914
- this.http = inject(HttpClient);
1915
- this.sessionInfoService = inject(SessionInfo);
1916
1927
  this._isIamSessionExpired = new BehaviorSubject(false);
1917
1928
  }
1918
1929
  get isIamSessionExpired() {
@@ -1922,14 +1933,7 @@ class IamExpiredInterceptorService {
1922
1933
  this._isIamSessionExpired.next(true);
1923
1934
  }
1924
1935
  intercept(req, next) {
1925
- // Skip interceptor for the preliminary requests (getRenewIamSessionIfConnected())
1926
- if (req.url.includes(SESSION_INFO_RENEW_URL) ||
1927
- req.url.includes(SESSION_INFO_API_URL)) {
1928
- return next
1929
- .handle(req)
1930
- .pipe(catchError(this.handleError.bind(this)));
1931
- }
1932
- return this.getRenewIamSessionIfConnected().pipe(switchMap(() => next.handle(req).pipe(map(event => {
1936
+ return next.handle(req).pipe(map(event => {
1933
1937
  if (event instanceof HttpResponseBase) {
1934
1938
  if (hasIamExpiredHeader(event) ||
1935
1939
  isRedirectionToLogin(event)) {
@@ -1937,17 +1941,7 @@ class IamExpiredInterceptorService {
1937
1941
  }
1938
1942
  }
1939
1943
  return event;
1940
- }), catchError(this.handleError.bind(this)))));
1941
- }
1942
- getRenewIamSessionIfConnected() {
1943
- // call session info through RP IAM (prestations.vd.ch) if user is connected
1944
- // this renews the session since it is a "secure" endpoint
1945
- // use OPTIONS to avoid extra load on session info
1946
- const isUserConnected = this.sessionInfoService.data.pipe(map(sessionInfo => !!sessionInfo?.context), catchError(() => of(null)));
1947
- const renewIamSession = this.http
1948
- .options(SESSION_INFO_RENEW_URL)
1949
- .pipe(catchError(() => of(null)));
1950
- return isUserConnected.pipe(take(1), switchMap(isConnected => (isConnected ? renewIamSession : of(null))));
1944
+ }), catchError(this.handleError.bind(this)));
1951
1945
  }
1952
1946
  handleError(err) {
1953
1947
  if (err instanceof HttpErrorResponse) {
@@ -5677,12 +5671,12 @@ class GesdemActionRecoveryLoginComponent {
5677
5671
  this.router = router;
5678
5672
  this.route = route;
5679
5673
  this.eventsLoggerService = eventsLoggerService;
5680
- this.missingRecoveryInfos = false;
5681
- this.alreadyTransferred = false;
5674
+ this.demandeNotFound = false;
5675
+ this.rateLimited = false;
5676
+ this.rateLimitCounter = 0;
5682
5677
  }
5683
5678
  ngOnInit() {
5684
5679
  this.otpRecipient = null;
5685
- this.missingRecoveryInfos = false;
5686
5680
  this.applicationInfoService.currentEtapeInfo
5687
5681
  .pipe(tap(currentEtape => {
5688
5682
  if (currentEtape.reprisePossible) {
@@ -5708,6 +5702,9 @@ class GesdemActionRecoveryLoginComponent {
5708
5702
  // eslint-disable-next-line rxjs-angular/prefer-async-pipe
5709
5703
  .subscribe();
5710
5704
  }
5705
+ ngOnDestroy() {
5706
+ this.rateLimitCounterSub?.unsubscribe();
5707
+ }
5711
5708
  validateOtp() {
5712
5709
  this.eventsLoggerService.addEvent(SdkEventType.RECOVERY_LOGIN_STARTED);
5713
5710
  if (!this.route.snapshot.queryParams.reCaptchaByPassUUID &&
@@ -5773,35 +5770,56 @@ class GesdemActionRecoveryLoginComponent {
5773
5770
  }
5774
5771
  });
5775
5772
  }
5773
+ getPluralMarker(count) {
5774
+ return this.dictionaryService.getPluralMarkerSync(count);
5775
+ }
5776
5776
  startRecovery() {
5777
+ this.rateLimited = false;
5778
+ this.demandeNotFound = false;
5777
5779
  this.recoveryService
5778
5780
  .startRecovery(this.reference)
5779
5781
  .pipe(catchError((response) => {
5780
5782
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5781
5783
  const { error, status } = response;
5782
- this.missingRecoveryInfos =
5784
+ this.rateLimited = status === 429;
5785
+ if (this.rateLimited) {
5786
+ this.startRateLimitCounter();
5787
+ return EMPTY;
5788
+ }
5789
+ this.demandeNotFound =
5783
5790
  status === 404 &&
5784
5791
  error &&
5785
- JSON.parse(error).code === 'ACTION_RECOVERY_NOT_FOUND';
5786
- this.alreadyTransferred =
5787
- status === 409 &&
5788
- error &&
5789
- JSON.parse(error).code === 'ACTION_ALREADY_TRANSFERRED';
5790
- if (!this.missingRecoveryInfos &&
5791
- !this.alreadyTransferred) {
5792
- this.growlService.addWithType(GrowlType.DANGER, this.dictionaryService.getKeySync('gesdem-action-recovery-login.password-generation-failed.label'));
5792
+ JSON.parse(error).code === DEMANDE_NOT_FOUND;
5793
+ if (this.demandeNotFound) {
5794
+ return EMPTY;
5793
5795
  }
5796
+ this.growlService.addWithType(GrowlType.DANGER, this.dictionaryService.getKeySync('gesdem-action-recovery-login.password-generation-failed.label'));
5794
5797
  return throwError(() => true);
5795
5798
  }))
5796
5799
  // eslint-disable-next-line rxjs-angular/prefer-async-pipe
5797
- .subscribe(otpRecipient => (this.otpRecipient = otpRecipient));
5800
+ .subscribe(otpRecipient => {
5801
+ this.otpRecipient = otpRecipient;
5802
+ this.startRateLimitCounter();
5803
+ });
5804
+ }
5805
+ startRateLimitCounter() {
5806
+ this.rateLimitCounter = 30;
5807
+ const rateLimitCounterSub = interval(1000)
5808
+ .pipe(take(30))
5809
+ // eslint-disable-next-line rxjs-angular/prefer-async-pipe
5810
+ .subscribe(() => {
5811
+ this.rateLimitCounter--;
5812
+ if (this.rateLimitCounter === 0) {
5813
+ rateLimitCounterSub?.unsubscribe();
5814
+ }
5815
+ });
5798
5816
  }
5799
5817
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: GesdemActionRecoveryLoginComponent, deps: [{ token: GesdemActionRecoveryService }, { token: GrowlBrokerService }, { token: FoehnConfirmModalService }, { token: ValidationHandlerService }, { token: ApplicationInfoService }, { token: GesdemHandlerService }, { token: SdkDictionaryService }, { token: i1$1.Router }, { token: i1$1.ActivatedRoute }, { token: SdkEventsLoggerService }], target: i0.ɵɵFactoryTarget.Component }); }
5800
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.17", type: GesdemActionRecoveryLoginComponent, isStandalone: false, selector: "gesdem-action-recovery-login", inputs: { reference: "reference", redirectTarget: "redirectTarget" }, viewQueries: [{ propertyName: "loginForm", first: true, predicate: FoehnFormComponent, descendants: true }, { propertyName: "recaptchaComponent", first: true, predicate: SdkRecaptchaComponent, descendants: true }], ngImport: i0, template: "<div class=\"container mt-5\">\n <div class=\"alert alert-danger\" *ngIf=\"missingRecoveryInfos\">\n Vous n'avez pas indiqu\u00E9 d'informations de contact pour la reprise de\n cette demande, merci de contacter le support.\n </div>\n <div class=\"alert alert-danger\" *ngIf=\"alreadyTransferred\">\n La demande que vous essayez de reprendre a d\u00E9j\u00E0 \u00E9t\u00E9 transmise, elle\n n'est plus modifiable.\n </div>\n\n <foehn-form [shouldDisplayAlertSummary]=\"false\" *ngIf=\"otpRecipient\">\n <div class=\"row\">\n <div class=\"col-md-8\">\n <foehn-input-text\n [label]=\"\n 'Veuillez saisir le code envoy\u00E9 par SMS au num\u00E9ro ' +\n otpRecipient\n \"\n [(model)]=\"otp\"\n name=\"otp\"\n [required]=\"true\"\n ></foehn-input-text>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-8\">\n Pour obtenir un nouveau code, vous devez recliquer sur le\n <a [href]=\"redirectTarget\">lien</a>\n de reprise de la demande\n </div>\n </div>\n\n <br />\n\n <div class=\"row\">\n <div class=\"col-md-8\">\n <captcha></captcha>\n\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-dark float-end\"\n (click)=\"validateOtp()\"\n >\n Suivant\n </button>\n </div>\n </div>\n </foehn-form>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FoehnInputTextComponent, selector: "foehn-input-text", inputs: ["numberOnly"] }, { kind: "component", type: FoehnFormComponent, selector: "foehn-form", inputs: ["shouldDisplayAlertSummary"] }, { kind: "component", type: SdkRecaptchaComponent, selector: "captcha" }] }); }
5818
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.17", type: GesdemActionRecoveryLoginComponent, isStandalone: false, selector: "gesdem-action-recovery-login", inputs: { reference: "reference", redirectTarget: "redirectTarget" }, viewQueries: [{ propertyName: "loginForm", first: true, predicate: FoehnFormComponent, descendants: true }, { propertyName: "recaptchaComponent", first: true, predicate: SdkRecaptchaComponent, descendants: true }], ngImport: i0, template: "<div class=\"container mt-5\">\n <div\n class=\"alert alert-danger\"\n *ngIf=\"demandeNotFound\"\n [innerHTML]=\"'gesdem-error.text.demande-not-found' | fromDictionary\"\n ></div>\n\n <div class=\"alert alert-danger\" *ngIf=\"rateLimited\">\n @if (rateLimitCounter > 0) {\n <span\n [innerHTML]=\"\n 'gesdem-action-recovery-login.rate-limited.label'\n | fromDictionary\n : {\n rateLimitCounter:\n rateLimitCounter?.toString(),\n plural: getPluralMarker(rateLimitCounter)\n }\n \"\n ></span>\n } @else {\n <span\n [innerHTML]=\"\n 'gesdem-action-recovery-login.request-now-code.label'\n | fromDictionary: { redirectTarget: redirectTarget }\n \"\n ></span>\n }\n </div>\n\n <foehn-form [shouldDisplayAlertSummary]=\"false\" *ngIf=\"otpRecipient\">\n <div class=\"row\">\n <div class=\"col-md-8\">\n <foehn-input-text\n [label]=\"\n 'Veuillez saisir le code envoy\u00E9 par SMS au num\u00E9ro ' +\n otpRecipient\n \"\n [(model)]=\"otp\"\n name=\"otp\"\n [required]=\"true\"\n ></foehn-input-text>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-8\">\n @if (rateLimitCounter > 0) {\n <span\n [innerHTML]=\"\n 'gesdem-action-recovery-login.rate-limited.label'\n | fromDictionary\n : {\n rateLimitCounter:\n rateLimitCounter?.toString(),\n plural: getPluralMarker(\n rateLimitCounter\n )\n }\n \"\n ></span>\n } @else {\n <span\n [innerHTML]=\"\n 'gesdem-action-recovery-login.request-now-code.label'\n | fromDictionary\n : { redirectTarget: redirectTarget }\n \"\n ></span>\n }\n </div>\n </div>\n\n <br />\n\n <div class=\"row\">\n <div class=\"col-md-8\">\n <captcha></captcha>\n\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-dark float-end\"\n (click)=\"validateOtp()\"\n >\n Suivant\n </button>\n </div>\n </div>\n </foehn-form>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: FoehnInputTextComponent, selector: "foehn-input-text", inputs: ["numberOnly"] }, { kind: "component", type: FoehnFormComponent, selector: "foehn-form", inputs: ["shouldDisplayAlertSummary"] }, { kind: "component", type: SdkRecaptchaComponent, selector: "captcha" }, { kind: "pipe", type: SdkDictionaryPipe, name: "fromDictionary" }] }); }
5801
5819
  }
5802
5820
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.17", ngImport: i0, type: GesdemActionRecoveryLoginComponent, decorators: [{
5803
5821
  type: Component,
5804
- args: [{ selector: 'gesdem-action-recovery-login', standalone: false, template: "<div class=\"container mt-5\">\n <div class=\"alert alert-danger\" *ngIf=\"missingRecoveryInfos\">\n Vous n'avez pas indiqu\u00E9 d'informations de contact pour la reprise de\n cette demande, merci de contacter le support.\n </div>\n <div class=\"alert alert-danger\" *ngIf=\"alreadyTransferred\">\n La demande que vous essayez de reprendre a d\u00E9j\u00E0 \u00E9t\u00E9 transmise, elle\n n'est plus modifiable.\n </div>\n\n <foehn-form [shouldDisplayAlertSummary]=\"false\" *ngIf=\"otpRecipient\">\n <div class=\"row\">\n <div class=\"col-md-8\">\n <foehn-input-text\n [label]=\"\n 'Veuillez saisir le code envoy\u00E9 par SMS au num\u00E9ro ' +\n otpRecipient\n \"\n [(model)]=\"otp\"\n name=\"otp\"\n [required]=\"true\"\n ></foehn-input-text>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-8\">\n Pour obtenir un nouveau code, vous devez recliquer sur le\n <a [href]=\"redirectTarget\">lien</a>\n de reprise de la demande\n </div>\n </div>\n\n <br />\n\n <div class=\"row\">\n <div class=\"col-md-8\">\n <captcha></captcha>\n\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-dark float-end\"\n (click)=\"validateOtp()\"\n >\n Suivant\n </button>\n </div>\n </div>\n </foehn-form>\n</div>\n" }]
5822
+ args: [{ selector: 'gesdem-action-recovery-login', standalone: false, template: "<div class=\"container mt-5\">\n <div\n class=\"alert alert-danger\"\n *ngIf=\"demandeNotFound\"\n [innerHTML]=\"'gesdem-error.text.demande-not-found' | fromDictionary\"\n ></div>\n\n <div class=\"alert alert-danger\" *ngIf=\"rateLimited\">\n @if (rateLimitCounter > 0) {\n <span\n [innerHTML]=\"\n 'gesdem-action-recovery-login.rate-limited.label'\n | fromDictionary\n : {\n rateLimitCounter:\n rateLimitCounter?.toString(),\n plural: getPluralMarker(rateLimitCounter)\n }\n \"\n ></span>\n } @else {\n <span\n [innerHTML]=\"\n 'gesdem-action-recovery-login.request-now-code.label'\n | fromDictionary: { redirectTarget: redirectTarget }\n \"\n ></span>\n }\n </div>\n\n <foehn-form [shouldDisplayAlertSummary]=\"false\" *ngIf=\"otpRecipient\">\n <div class=\"row\">\n <div class=\"col-md-8\">\n <foehn-input-text\n [label]=\"\n 'Veuillez saisir le code envoy\u00E9 par SMS au num\u00E9ro ' +\n otpRecipient\n \"\n [(model)]=\"otp\"\n name=\"otp\"\n [required]=\"true\"\n ></foehn-input-text>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-md-8\">\n @if (rateLimitCounter > 0) {\n <span\n [innerHTML]=\"\n 'gesdem-action-recovery-login.rate-limited.label'\n | fromDictionary\n : {\n rateLimitCounter:\n rateLimitCounter?.toString(),\n plural: getPluralMarker(\n rateLimitCounter\n )\n }\n \"\n ></span>\n } @else {\n <span\n [innerHTML]=\"\n 'gesdem-action-recovery-login.request-now-code.label'\n | fromDictionary\n : { redirectTarget: redirectTarget }\n \"\n ></span>\n }\n </div>\n </div>\n\n <br />\n\n <div class=\"row\">\n <div class=\"col-md-8\">\n <captcha></captcha>\n\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-dark float-end\"\n (click)=\"validateOtp()\"\n >\n Suivant\n </button>\n </div>\n </div>\n </foehn-form>\n</div>\n" }]
5805
5823
  }], ctorParameters: () => [{ type: GesdemActionRecoveryService }, { type: GrowlBrokerService }, { type: FoehnConfirmModalService }, { type: ValidationHandlerService }, { type: ApplicationInfoService }, { type: GesdemHandlerService }, { type: SdkDictionaryService }, { type: i1$1.Router }, { type: i1$1.ActivatedRoute }, { type: SdkEventsLoggerService }], propDecorators: { reference: [{
5806
5824
  type: Input
5807
5825
  }], redirectTarget: [{
@@ -16878,5 +16896,5 @@ class SdkLog {
16878
16896
  * Generated bundle index. Do not edit.
16879
16897
  */
16880
16898
 
16881
- export { APP_INFO_API_URL, AbstractFoehnUploaderComponent, AbstractListDetailPageComponent, AbstractMenuPageComponent, AbstractPageComponent, AbstractPageFromMenuComponent, ActionStatut, Address, AddressTypeLight, ApplicationInfo, ApplicationInfoService, BAD_PARAMS_HELP_TEXT, BoDocumentError, BoDocumentsWithErrors, BoMultiUploadService, Breadcrumb, BreadcrumbEventService, BreadcrumbItem, CAPTCHA_ERROR_NAME, CURRENCY_REGEXP, Calendar, Canton, Captcha, ComponentError, Configuration, Country, CurrencyHelper, CurrentWeek, DECIMALS_SEPARATOR, DEFAULT_INTERNATIONAL_AND_NO_SWISS, DEFAULT_INTERNATIONAL_AND_NO_SWISS_MOBILE, DEFAULT_INTERNATIONAL_AND_NO_SWISS_PHONE, DEFAULT_INTERNATIONAL_HELP_TEXT, DEFAULT_PREFIX, DEFAULT_SWISS_HELP_TEXT, DEFAULT_SWISS_MOBILE_PHONE_HELP_TEXT, DEFAULT_SWISS_PHONE_HELP_TEXT, DICTIONARY_BASE_URL, DateHelper, DatePickerHelper, DatePickerNavigationHelper, DayMonth, DaySlots, DemandeExpirationService, DemandeHelper, DisplayCurrencyPipe, DisplayDatePipe, District, Document, DocumentError, DocumentReference, DocumentReferenceWithFile, DocumentsWithErrors, DropdownMenuGroup, DropdownMenuItem, EPaymentService, EtapeInfo, FEEDBACK_USAGERS_LOCAL_STORAGE_PREFIX, FORM_SUPPORT_CYBER_TITLE_FALLBACK, FocusedDay, FoehnAbbrComponent, FoehnAddressModule, FoehnAgendaComponent, FoehnAgendaModule, FoehnAgendaNavigationComponent, FoehnAgendaTimeslotPanelComponent, FoehnAutocompleteComponent, FoehnAutocompleteModule, FoehnBoMultiUploadComponent, FoehnBoMultiUploadModule, FoehnBooleanCheckboxComponent, FoehnBooleanModule, FoehnBooleanRadioComponent, FoehnBreadcrumbComponent, FoehnBreadcrumbModule, FoehnCheckableGroupComponent, FoehnCheckablesModule, FoehnCheckboxComponent, FoehnConfirmModalComponent, FoehnConfirmModalContent, FoehnConfirmModalModule, FoehnConfirmModalService, FoehnDateComponent, FoehnDatePickerButtonComponent, FoehnDatePickerButtonModule, FoehnDatePickerComponent, FoehnDatePickerModule, FoehnDateTimeComponent, FoehnDecisionElectroniqueComponent, FoehnDecisionElectroniqueModule, FoehnDisplayAddressComponent, FoehnDropdownMenuComponent, FoehnDropdownMenuModule, FoehnErrorPillComponent, FoehnFeedbackNotificationComponent, FoehnFeedbackNotificationModule, FoehnFormComponent, FoehnFormModule, FoehnHeaderComponent, FoehnHeaderModule, FoehnHelpModalComponent, FoehnHelpModalModule, FoehnIconCalendarComponent, FoehnIconCheckComponent, FoehnIconCheckSquareOComponent, FoehnIconChevronDownComponent, FoehnIconChevronLeftComponent, FoehnIconChevronRightComponent, FoehnIconChevronUpComponent, FoehnIconClockComponent, FoehnIconCommentDotsComponent, FoehnIconEditComponent, FoehnIconExternalLinkAltComponent, FoehnIconFilePdfComponent, FoehnIconInfoCircleComponent, FoehnIconLockComponent, FoehnIconMapMarkerComponent, FoehnIconMinusCircleComponent, FoehnIconPencilComponent, FoehnIconPlusCircleComponent, FoehnIconPlusSquareComponent, FoehnIconSearchComponent, FoehnIconTimesComponent, FoehnIconTrashAltComponent, FoehnIconUnlockAltComponent, FoehnIconUserComponent, FoehnIconsModule, FoehnInputAddressComponent, FoehnInputComponent, FoehnInputEmailComponent, FoehnInputForeignLocalityComponent, FoehnInputForeignStreetComponent, FoehnInputHiddenComponent, FoehnInputModule, FoehnInputNav13Component, FoehnInputNav13Module, FoehnInputNumberComponent, FoehnInputPasswordComponent, FoehnInputPhoneComponent, FoehnInputPrefixedTextComponent, FoehnInputStringComponent, FoehnInputTextComponent, FoehnInputTextareaComponent, FoehnListComponent, FoehnListItem, FoehnListModule, FoehnListSummaryComponent, FoehnMenuItemComponent, FoehnMenuItemTransmitComponent, FoehnMenuPrestationModule, FoehnMiscModule, FoehnModalComponent, FoehnModalModule, FoehnMultiUploadComponent, FoehnMultiUploadModule, FoehnMultiselectAutocompleteComponent, FoehnMultiselectAutocompleteModule, FoehnNavigationComponent, FoehnNavigationModule, FoehnNavigationService, FoehnNotFoundModule, FoehnNotfoundComponent, FoehnPageComponent, FoehnPageCounterComponent, FoehnPageExpirationTimerComponent, FoehnPageModalComponent, FoehnPageModule, FoehnPageService, FoehnPictureUploadComponent, FoehnPictureUploadModule, FoehnRadioComponent, FoehnRecapSectionComponent, FoehnRecapSectionModule, FoehnRemainingAlertsSummaryComponent, FoehnRemainingAlertsSummaryModule, FoehnSelectComponent, FoehnSimpleNavigationComponent, FoehnSkipLinkComponent, FoehnStatusProgressBarComponent, FoehnStatusProgressBarModule, FoehnTableColumnConfiguration, FoehnTableComponent, FoehnTableModule, FoehnTablePageChangeEvent, FoehnTimeComponent, FoehnTransmitWaitingModalComponent, FoehnTransmitWaitingModalService, FoehnUploadProgressBarComponent, FoehnUploadProgressBarModule, FoehnUserConnectedAsComponent, FoehnUserConnectedAsModule, FoehnValidationAlertSummaryComponent, FoehnValidationAlertSummaryModule, FoehnValidationAlertsComponent, FoehnValidationAlertsModule, FooterLink, FormMetadata, FormPostResponse, FormSelectOption, FormatIdePipe, FormatterModule, GESDEM_MAX_DATA_LENGTH, GesdemActionRecoveryLoginComponent, GesdemActionRecoveryModule, GesdemActionRecoveryRegistrationComponent, GesdemConfirmationComponent, GesdemConfirmationModule, GesdemErrorComponent, GesdemErrorModule, GesdemEventService, GesdemHandlerService, GesdemStatutUtils, GrowlBrokerService, GrowlMessage, GrowlType, HTTP_LOADER_FILTERED_URL, I18nForm, IbanFormatterDirective, IdeFormatterDirective, IntervalHelper, Locality, MonthYear, MultiUploadService, Municipality, NDCFormatterDirective, NavigationDirection, NumberCurrencyFormatterDirective, ObjectHelper, PORTAIL_BASE_URL_INT, PORTAIL_BASE_URL_PROD, PORTAIL_BASE_URL_VAL, PageChangeEvent, PageUploadLimitService, PaginationWeek, PendingFiles, PendingPaymentComponent, PendingUploadService, PipeModule, PlaceOfOrigin, Portail, PostalLocality, Preferences, PrestationsNgCoreModule, RECAPTCHA_API_URL, RecaptchaService, RedirectComponent, RegisterNgModelService, RowElement, SESSION_INFO_API_URL, SESSION_INFO_RENEW_URL, SWISS_ISO_ID, ScrollHelper, SdkDictionaryModule, SdkDictionaryPipe, SdkDictionaryService, SdkEpaymentComponent, SdkEpaymentModule, SdkEvent, SdkEventType, SdkEventsLoggerService, SdkLog, SdkLogLevel, SdkLogsService, SdkRecaptchaComponent, SdkRecaptchaModule, SdkRedirectModule, SdkStatisticsService, SelectedSlot, ServiceLocator, Session, SessionInfo, SessionInfoData, SessionInfoWithApplicationService, Street, StreetNumber, THOUSANDS_SEPARATOR, TRANSMIT_WAITING_MODAL_DELAY_IN_MILLISECONDS, TableSort, UploadProgress, UploadProgressService, UploaderHelper, ValidationHandlerService, formatDecimalCurrency, formatNonDecimalCurrency, formatNumberAsGiven, gesdemLoaderGuard, replaceAll };
16899
+ export { APP_INFO_API_URL, AbstractFoehnUploaderComponent, AbstractListDetailPageComponent, AbstractMenuPageComponent, AbstractPageComponent, AbstractPageFromMenuComponent, ActionStatut, Address, AddressTypeLight, ApplicationInfo, ApplicationInfoService, BAD_PARAMS_HELP_TEXT, BoDocumentError, BoDocumentsWithErrors, BoMultiUploadService, Breadcrumb, BreadcrumbEventService, BreadcrumbItem, CAPTCHA_ERROR_NAME, CURRENCY_REGEXP, Calendar, Canton, Captcha, ComponentError, Configuration, Country, CurrencyHelper, CurrentWeek, DECIMALS_SEPARATOR, DEFAULT_INTERNATIONAL_AND_NO_SWISS, DEFAULT_INTERNATIONAL_AND_NO_SWISS_MOBILE, DEFAULT_INTERNATIONAL_AND_NO_SWISS_PHONE, DEFAULT_INTERNATIONAL_HELP_TEXT, DEFAULT_PREFIX, DEFAULT_SWISS_HELP_TEXT, DEFAULT_SWISS_MOBILE_PHONE_HELP_TEXT, DEFAULT_SWISS_PHONE_HELP_TEXT, DICTIONARY_BASE_URL, DateHelper, DatePickerHelper, DatePickerNavigationHelper, DayMonth, DaySlots, DemandeExpirationService, DemandeHelper, DisplayCurrencyPipe, DisplayDatePipe, District, Document, DocumentError, DocumentReference, DocumentReferenceWithFile, DocumentsWithErrors, DropdownMenuGroup, DropdownMenuItem, EPaymentService, EtapeInfo, FEEDBACK_USAGERS_LOCAL_STORAGE_PREFIX, FORM_SUPPORT_CYBER_TITLE_FALLBACK, FocusedDay, FoehnAbbrComponent, FoehnAddressModule, FoehnAgendaComponent, FoehnAgendaModule, FoehnAgendaNavigationComponent, FoehnAgendaTimeslotPanelComponent, FoehnAutocompleteComponent, FoehnAutocompleteModule, FoehnBoMultiUploadComponent, FoehnBoMultiUploadModule, FoehnBooleanCheckboxComponent, FoehnBooleanModule, FoehnBooleanRadioComponent, FoehnBreadcrumbComponent, FoehnBreadcrumbModule, FoehnCheckableGroupComponent, FoehnCheckablesModule, FoehnCheckboxComponent, FoehnConfirmModalComponent, FoehnConfirmModalContent, FoehnConfirmModalModule, FoehnConfirmModalService, FoehnDateComponent, FoehnDatePickerButtonComponent, FoehnDatePickerButtonModule, FoehnDatePickerComponent, FoehnDatePickerModule, FoehnDateTimeComponent, FoehnDecisionElectroniqueComponent, FoehnDecisionElectroniqueModule, FoehnDisplayAddressComponent, FoehnDropdownMenuComponent, FoehnDropdownMenuModule, FoehnErrorPillComponent, FoehnFeedbackNotificationComponent, FoehnFeedbackNotificationModule, FoehnFormComponent, FoehnFormModule, FoehnHeaderComponent, FoehnHeaderModule, FoehnHelpModalComponent, FoehnHelpModalModule, FoehnIconCalendarComponent, FoehnIconCheckComponent, FoehnIconCheckSquareOComponent, FoehnIconChevronDownComponent, FoehnIconChevronLeftComponent, FoehnIconChevronRightComponent, FoehnIconChevronUpComponent, FoehnIconClockComponent, FoehnIconCommentDotsComponent, FoehnIconEditComponent, FoehnIconExternalLinkAltComponent, FoehnIconFilePdfComponent, FoehnIconInfoCircleComponent, FoehnIconLockComponent, FoehnIconMapMarkerComponent, FoehnIconMinusCircleComponent, FoehnIconPencilComponent, FoehnIconPlusCircleComponent, FoehnIconPlusSquareComponent, FoehnIconSearchComponent, FoehnIconTimesComponent, FoehnIconTrashAltComponent, FoehnIconUnlockAltComponent, FoehnIconUserComponent, FoehnIconsModule, FoehnInputAddressComponent, FoehnInputComponent, FoehnInputEmailComponent, FoehnInputForeignLocalityComponent, FoehnInputForeignStreetComponent, FoehnInputHiddenComponent, FoehnInputModule, FoehnInputNav13Component, FoehnInputNav13Module, FoehnInputNumberComponent, FoehnInputPasswordComponent, FoehnInputPhoneComponent, FoehnInputPrefixedTextComponent, FoehnInputStringComponent, FoehnInputTextComponent, FoehnInputTextareaComponent, FoehnListComponent, FoehnListItem, FoehnListModule, FoehnListSummaryComponent, FoehnMenuItemComponent, FoehnMenuItemTransmitComponent, FoehnMenuPrestationModule, FoehnMiscModule, FoehnModalComponent, FoehnModalModule, FoehnMultiUploadComponent, FoehnMultiUploadModule, FoehnMultiselectAutocompleteComponent, FoehnMultiselectAutocompleteModule, FoehnNavigationComponent, FoehnNavigationModule, FoehnNavigationService, FoehnNotFoundModule, FoehnNotfoundComponent, FoehnPageComponent, FoehnPageCounterComponent, FoehnPageExpirationTimerComponent, FoehnPageModalComponent, FoehnPageModule, FoehnPageService, FoehnPictureUploadComponent, FoehnPictureUploadModule, FoehnRadioComponent, FoehnRecapSectionComponent, FoehnRecapSectionModule, FoehnRemainingAlertsSummaryComponent, FoehnRemainingAlertsSummaryModule, FoehnSelectComponent, FoehnSimpleNavigationComponent, FoehnSkipLinkComponent, FoehnStatusProgressBarComponent, FoehnStatusProgressBarModule, FoehnTableColumnConfiguration, FoehnTableComponent, FoehnTableModule, FoehnTablePageChangeEvent, FoehnTimeComponent, FoehnTransmitWaitingModalComponent, FoehnTransmitWaitingModalService, FoehnUploadProgressBarComponent, FoehnUploadProgressBarModule, FoehnUserConnectedAsComponent, FoehnUserConnectedAsModule, FoehnValidationAlertSummaryComponent, FoehnValidationAlertSummaryModule, FoehnValidationAlertsComponent, FoehnValidationAlertsModule, FooterLink, FormMetadata, FormPostResponse, FormSelectOption, FormatIdePipe, FormatterModule, GESDEM_MAX_DATA_LENGTH, GesdemActionRecoveryLoginComponent, GesdemActionRecoveryModule, GesdemActionRecoveryRegistrationComponent, GesdemConfirmationComponent, GesdemConfirmationModule, GesdemErrorComponent, GesdemErrorModule, GesdemEventService, GesdemHandlerService, GesdemStatutUtils, GrowlBrokerService, GrowlMessage, GrowlType, HTTP_LOADER_FILTERED_URL, I18nForm, IbanFormatterDirective, IdeFormatterDirective, IntervalHelper, Locality, MonthYear, MultiUploadService, Municipality, NDCFormatterDirective, NavigationDirection, NumberCurrencyFormatterDirective, ObjectHelper, PORTAIL_BASE_URL_INT, PORTAIL_BASE_URL_PROD, PORTAIL_BASE_URL_VAL, PageChangeEvent, PageUploadLimitService, PaginationWeek, PendingFiles, PendingPaymentComponent, PendingUploadService, PipeModule, PlaceOfOrigin, Portail, PostalLocality, Preferences, PrestationsNgCoreModule, RECAPTCHA_API_URL, RecaptchaService, RedirectComponent, RegisterNgModelService, RowElement, SESSION_INFO_API_URL, SWISS_ISO_ID, ScrollHelper, SdkDictionaryModule, SdkDictionaryPipe, SdkDictionaryService, SdkEpaymentComponent, SdkEpaymentModule, SdkEvent, SdkEventType, SdkEventsLoggerService, SdkLog, SdkLogLevel, SdkLogsService, SdkRecaptchaComponent, SdkRecaptchaModule, SdkRedirectModule, SdkStatisticsService, SelectedSlot, ServiceLocator, Session, SessionInfo, SessionInfoData, SessionInfoWithApplicationService, Street, StreetNumber, THOUSANDS_SEPARATOR, TRANSMIT_WAITING_MODAL_DELAY_IN_MILLISECONDS, TableSort, UploadProgress, UploadProgressService, UploaderHelper, ValidationHandlerService, formatDecimalCurrency, formatNonDecimalCurrency, formatNumberAsGiven, gesdemLoaderGuard, replaceAll };
16882
16900
  //# sourceMappingURL=dsivd-prestations-ng.mjs.map