@dsivd/prestations-ng 19.2.0-beta.10 → 19.2.0-beta.12

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
@@ -38,6 +38,19 @@
38
38
  - Added `streetAllowCustomValue` input to control whether the street field allows custom values (defaults to `true`).
39
39
  - Added `swissNpaLocalityBaseUrl` input to control the base URL for Swiss NPA localities (defaults to `'api/refinf/locality'`).
40
40
 
41
+ - [foehn-navigation.component.html](projects/prestations-ng/src/foehn-navigation/foehn-navigation/foehn-navigation.component.html)
42
+ - [foehn-simple-navigation.component.html](projects/prestations-ng/src/foehn-navigation/foehn-simple-navigation/foehn-simple-navigation.component.html)
43
+ - while the page targeted by "next", "transmit" or "previous" is loading for more than 200 ms (e.g. lazy loaded
44
+ route), the clicked button displays a spinner with the new `loadingLabel` input (dictionary key
45
+ `foehn-navigation.loading.label`, "Chargement...") and the navigation buttons are disabled (`aria-disabled`;
46
+ clicks are ignored from the start of the navigation); a live `output` region announces the loading to screen
47
+ readers (also in 18.3.15)
48
+ - this state is exposed by read-only signals: `pendingNavigationDirection`, `loadingDirection`, `isNavigating`,
49
+ `isLoading`, `isLoadingNext` and `isLoadingPrevious`
50
+ - [foehn-navigation.service.ts](projects/prestations-ng/src/foehn-navigation/foehn-navigation.service.ts)
51
+ - new method `pendingNavigationDirection()`: direction of the navigation started with `next()` or `previous()`
52
+ until it ends, `null` otherwise (also in 18.3.15)
53
+
41
54
  ### Changed
42
55
 
43
56
  Library now runs as strict mode, which may cause some errors to appear in your project after updating.
@@ -57,6 +70,12 @@ Please check the [UPGRADING_V19.md](UPGRADING_V19.md) guide for more information
57
70
  `addCustomErrorOrDefault(name, errors, errorCode, fileName, customErrors, { overrideAcceptedExtensions, overrideMaxFileNameLength, overrideIllegalCharacters, maxFileSizeInMo })`.
58
71
  The custom error 413 returned by the server now also displays the `maxFileSizeInMo` limit of
59
72
  `foehn-bo-multi-upload`.
73
+ - [foehn-modal.component.ts](projects/prestations-ng/src/foehn-modal/foehn-modal.component.ts)
74
+ - 🚨 `modalSize` is now typed with the new `FoehnModalSize` type
75
+ (`'' | 'modal-sm' | 'modal-md' | 'modal-lg' | 'modal-xl'`) instead of `string`, as are `HelpModal.modalSize`
76
+ and therefore the `helpModal` of the `foehn-input-*` components. Other values, such as `modal-xs`, are not
77
+ Bootstrap classes, had no effect and no longer compile: replace them with `modal-md` to keep the same size
78
+ (removing them in a `HelpModal` would fall back to `modal-lg`).
60
79
  - 🚀 **prestations-ng is now zoneless**: its components no longer need zone.js to be refreshed. They keep
61
80
  working in an application using zone.js, and your application can now drop zone.js, see
62
81
  [UPGRADING_V19.md](UPGRADING_V19.md#zoneless-optional-but-recommended).
@@ -134,6 +153,11 @@ Please check the [UPGRADING_V19.md](UPGRADING_V19.md) guide for more information
134
153
 
135
154
  ### Fixed
136
155
 
156
+ - `AbstractPageComponent` and `AbstractPageFromMenuComponent`: a second click on "next" or "transmit" while the next
157
+ page is loading (lazy loaded route, resolver, async guard) no longer saves again and skips the next page:
158
+ `send()`, `sendAndTransmit()` and `transmit()` are ignored until the navigation to the next page ends. Pages
159
+ overriding `onFormSent()` should call the new protected method `navigateToNextPage()` instead of
160
+ `this._navigation.next()` to get this protection (also in 18.3.15).
137
161
  - `captcha`: no more `NG0953` warning ("Unexpected emit for destroyed `OutputRef`") when the captcha script fails to
138
162
  load after the component has been destroyed (e.g. the user left the page meanwhile).
139
163
  - `foehn-multiselect-autocomplete`: the suggestions and the message displayed once every element is selected follow a
@@ -194,6 +218,9 @@ Please check the [UPGRADING_V19.md](UPGRADING_V19.md) guide for more information
194
218
  - `ng add @dsivd/prestations-ng` works again on the Angular workspaces created since Angular 14: it failed because
195
219
  `angular.json` no longer has a `defaultProject` (the dependencies are now added to every application), then
196
220
  because of the comments of `tsconfig.json` (now kept, like its formatting).
221
+ - `foehn-feedback-notification`: an error of `api/feedbacknotification/queryparams/{reference}` is logged and the
222
+ links are displayed without the feedback url, it reached the `ErrorHandler` as unhandled.
223
+ - The npm package no longer contains its own archive (`dsivd-prestations-ng-<version>.tgz`).
197
224
 
198
225
  ## [19.1.1]
199
226
 
@@ -337,6 +364,24 @@ Please check the [UPGRADING_V19.md](UPGRADING_V19.md) guide for more information
337
364
  - [foehn-list-summary.component.ts](projects/prestations-ng/src/foehn-menu-prestation/foehn-list-summary/foehn-list-summary.component.ts)
338
365
  - `[list]` attribut has been removed. Use `[model]` instead.
339
366
 
367
+ ## [18.3.15]
368
+
369
+ ### Updated
370
+
371
+ - [foehn-navigation.component.html](projects/prestations-ng/src/foehn-navigation/foehn-navigation/foehn-navigation.component.html)
372
+ - [foehn-simple-navigation.component.html](projects/prestations-ng/src/foehn-navigation/foehn-simple-navigation/foehn-simple-navigation.component.html)
373
+ - while the page targeted by "next", "transmit" or "previous" is loading for more than 200 ms (e.g. lazy loaded route), the clicked button displays a spinner with the new `loadingLabel` input (dictionary key `foehn-navigation.loading.label`, "Chargement...") and the navigation buttons are disabled (`aria-disabled`; clicks are ignored from the start of the navigation); a `role="status"` region announces the loading to screen readers
374
+ - [foehn-navigation.service.ts](projects/prestations-ng/src/foehn-navigation/foehn-navigation.service.ts)
375
+ - new method `pendingNavigationDirection()`: direction of the navigation started with `next()` or `previous()` until it ends, `null` otherwise
376
+
377
+ ### Fixed
378
+
379
+ - [abstract-page-component.ts](projects/prestations-ng/src/abstract-page-component.ts)
380
+ - fixed a second click on "next" or "transmit" while the next page is loading (lazy loaded route, resolver, async guard) saving again and skipping the next page: `send()`, `sendAndTransmit()` and `transmit()` are now ignored until the navigation to the next page ends
381
+ - new protected method `navigateToNextPage()`: pages overriding `onFormSent()` should call it instead of `this._navigation.next()` to get this protection
382
+ - [abstract-page-from-menu.component.ts](projects/prestations-ng/src/foehn-menu-prestation/abstract-page-from-menu.component.ts)
383
+ - same fix when returning to the parent page
384
+
340
385
  ## [18.3.13]
341
386
 
342
387
  ### Fixed
package/CONTRIBUTING.md CHANGED
@@ -171,7 +171,7 @@ Alternatively, you can manually publish the package. Although this method is not
171
171
  - Ensure you can push to the npm registry: `npm adduser --registry=https://registry.npmjs.org --scope=@dsivd`
172
172
  - Update the version number in `package.json` either manually or with `npm version`
173
173
  - Commit and tag the version change
174
- - Package a new version of the library with `npm package`
174
+ - Package a new version of the library with `npm run package`
175
175
  - Publish the package:
176
176
  - `npm run publish:stable` for stable version (released to everybody)
177
177
  - `npm run publish:next` for next version (development only)
package/GOOD_PRACTICES.md CHANGED
@@ -461,8 +461,10 @@ private readonly changeDetectorRef = inject(ChangeDetectorRef);
461
461
  ngOnInit(): void {
462
462
  super.ngOnInit();
463
463
  this.sessionInfoWithApplicationService.prefillForm((info) => {
464
- this.form.email = info?.email ?? null;
465
- this.changeDetectorRef.markForCheck();
464
+ if (this.form) {
465
+ this.form.email = info?.email ?? null;
466
+ this.changeDetectorRef.markForCheck();
467
+ }
466
468
  });
467
469
  }
468
470
  ```
package/UPGRADING_V19.md CHANGED
@@ -1246,7 +1246,7 @@ In `front/src/`, remove the file `typings.d.ts` if it is still there.
1246
1246
  {
1247
1247
  "extends": "./tsconfig.json",
1248
1248
  "compilerOptions": {
1249
- "outDir": "../out-tsc/app",
1249
+ "outDir": "./out-tsc/app",
1250
1250
  "types": []
1251
1251
  },
1252
1252
  "include": ["src/**/*.ts"],
@@ -1448,12 +1448,15 @@ When using `IntelliJ`, you can run code inspection on your project to fix deprec
1448
1448
  - In your `tsconfig.json` file, add `"strict": true` in `compilerOptions` and remove `alwaysStrict`, `noImplicitThis`, `strictBindCallApply` and `strictFunctionTypes` as they are already included in `strict` mode.
1449
1449
  - In your `tsconfig.json` file, remove `useDefineForClassFields` from `compilerOptions`.
1450
1450
 
1451
- Now fix your project until no more errors:
1451
+ Now fix your project until no more errors (unlike `tsc -b`, these commands write nothing):
1452
1452
 
1453
1453
  ```bash
1454
- npx tsc -b --noEmit
1454
+ npx tsc -p tsconfig.app.json --noEmit
1455
+ npx tsc -p tsconfig.spec.json --noEmit
1455
1456
  ```
1456
1457
 
1458
+ `tsc` doesn't check the templates: the errors reported by `strictTemplates` appear when you build your application.
1459
+
1457
1460
  and finally run the following commands to build, test and start your application:
1458
1461
 
1459
1462
  ```bash
@@ -1515,6 +1518,8 @@ The CommonJS dependencies of prestations-ng are now `"iban"` and `"dayjs"` (whic
1515
1518
  "allowedCommonJsDependencies": ["iban", "dayjs"]
1516
1519
  ```
1517
1520
 
1521
+ Also remove the packages that are no longer installed (`npm ls <package>` lists nothing).
1522
+
1518
1523
  ### Zoneless (optional but recommended)
1519
1524
 
1520
1525
  Since v19.2, prestations-ng does not need zone.js anymore: the state of its components is held by signals, which
@@ -1558,6 +1563,10 @@ then uninstall zone.js:
1558
1563
  npm uninstall zone.js
1559
1564
  ```
1560
1565
 
1566
+ `zone.js` stays in your `package-lock.json` as an optional peer dependency of `@angular/core`: this is expected. Check
1567
+ instead that the build of your application no longer outputs a `polyfills` chunk (unless you still have other
1568
+ polyfills, e.g. `@angular/localize/init`).
1569
+
1561
1570
  #### Check your components
1562
1571
 
1563
1572
  Without zone.js, Angular refreshes a component only when it is notified that something changed:
@@ -1601,8 +1610,10 @@ Pay attention to:
1601
1610
  ngOnInit(): void {
1602
1611
  super.ngOnInit();
1603
1612
  this.sessionInfoWithApplicationService.prefillForm((info) => {
1604
- this.form.email = info?.email ?? null;
1605
- this.changeDetectorRef.markForCheck();
1613
+ if (this.form) {
1614
+ this.form.email = info?.email ?? null;
1615
+ this.changeDetectorRef.markForCheck();
1616
+ }
1606
1617
  });
1607
1618
  }
1608
1619
  ```
@@ -2,8 +2,8 @@ import * as i0 from '@angular/core';
2
2
  import { Injectable, inject, InjectionToken, model, input, viewChildren, viewChild, forwardRef, output, computed, linkedSignal, DestroyRef, signal, effect, untracked, PendingTasks, Directive, ChangeDetectorRef, Pipe, Component, contentChildren, EnvironmentInjector, runInInjectionContext, afterNextRender, ElementRef, Injector, makeEnvironmentProviders, ErrorHandler, provideBrowserGlobalErrorListeners, provideAppInitializer, importProvidersFrom, NgZone, afterRenderEffect, contentChild, TemplateRef } from '@angular/core';
3
3
  import { takeUntilDestroyed, toSignal, toObservable, outputToObservable } from '@angular/core/rxjs-interop';
4
4
  import { Router, ActivatedRoute, RouterLink, NavigationStart, NavigationEnd } from '@angular/router';
5
- import { Subject, BehaviorSubject, combineLatest, of, filter as filter$1, tap as tap$1, throwError, switchMap as switchMap$1, forkJoin, from, concatMap, toArray, EMPTY, startWith, merge, noop, interval, withLatestFrom, map as map$1, concat } from 'rxjs';
6
- import { filter, shareReplay, tap, map, debounceTime, catchError, switchMap, first, finalize, throttleTime, mergeMap, share, take, distinctUntilChanged, startWith as startWith$1, takeWhile, takeUntil } from 'rxjs/operators';
5
+ import { Subject, BehaviorSubject, combineLatest, of, filter as filter$1, tap as tap$1, throwError, switchMap as switchMap$1, forkJoin, from, concatMap, toArray, EMPTY, startWith, merge, noop, interval, withLatestFrom, timer, map as map$1, concat } from 'rxjs';
6
+ import { filter, shareReplay, tap, map, debounceTime, catchError, switchMap, first, finalize, throttleTime, mergeMap, share, take, distinctUntilChanged, startWith as startWith$1, takeWhile, takeUntil, skip } from 'rxjs/operators';
7
7
  import { HttpClient, HttpEventType, HttpResponse, HTTP_INTERCEPTORS, HttpStatusCode, HttpResponseBase, HttpErrorResponse, HttpParams, provideHttpClient, withInterceptorsFromDi, withInterceptors } from '@angular/common/http';
8
8
  import * as i1 from '@angular/forms';
9
9
  import { NgModel, NgForm, FormsModule } from '@angular/forms';
@@ -1193,6 +1193,7 @@ const DEFAULT_DICTIONARY = {
1193
1193
  'foehn-navigation.next.label': 'Suivant',
1194
1194
  'foehn-navigation.previous.label': 'Précédent',
1195
1195
  'foehn-navigation.transmit.label': 'Transmettre',
1196
+ 'foehn-navigation.loading.label': 'Chargement...',
1196
1197
  'foehn-navigation.continue-later.label': 'Envoyer un lien pour reprendre cette demande plus tard',
1197
1198
  'foehn-navigation.continue-later-already-registered.label': 'Modifier mes informations de reprise et envoyer un nouveau lien',
1198
1199
  'foehn-navigation.continue-later-connected.label': 'Finir la demande plus tard',
@@ -2530,6 +2531,8 @@ class FoehnNavigationService {
2530
2531
  isInit = false;
2531
2532
  initializedAndRouteActivated = new BehaviorSubject(false);
2532
2533
  linearRouting = true;
2534
+ pendingNavigationDirectionSubject = new BehaviorSubject(null);
2535
+ lastNavigationId = 0;
2533
2536
  get initialized() {
2534
2537
  return this.isInit;
2535
2538
  }
@@ -2607,6 +2610,14 @@ class FoehnNavigationService {
2607
2610
  hasBeenInitialized() {
2608
2611
  return this.initializedAndRouteActivated.asObservable();
2609
2612
  }
2613
+ /**
2614
+ * Direction of the navigation started with next() or previous() until it ends, null otherwise.
2615
+ * The current page stays displayed while the target one is activated (e.g. lazy loaded route).
2616
+ * @returns Observable<NavigationDirection | null>
2617
+ */
2618
+ pendingNavigationDirection() {
2619
+ return this.pendingNavigationDirectionSubject.asObservable();
2620
+ }
2610
2621
  getQueryParamsToForwardAsString() {
2611
2622
  const params = this.getQueryParamsToForward() || {};
2612
2623
  let stringParams = '';
@@ -2761,7 +2772,15 @@ class FoehnNavigationService {
2761
2772
  ? SdkEventType.NAVIGATION_FORWARD
2762
2773
  : SdkEventType.NAVIGATION_BACKWARD;
2763
2774
  this.eventsLoggerService.addEvent(eventType, route?.path);
2764
- return this.redirect(route?.path);
2775
+ const navigation = this.redirect(route?.path);
2776
+ const navigationId = ++this.lastNavigationId;
2777
+ this.pendingNavigationDirectionSubject.next(direction);
2778
+ return navigation.finally(() => {
2779
+ // A navigation replaced by a newer one ends first (cancelled).
2780
+ if (navigationId === this.lastNavigationId) {
2781
+ this.pendingNavigationDirectionSubject.next(null);
2782
+ }
2783
+ });
2765
2784
  }
2766
2785
  isRouteAvailable(route) {
2767
2786
  const { canActivate } = route;
@@ -3172,6 +3191,7 @@ class AbstractPageComponent {
3172
3191
  _pendingUploadService = inject(PendingUploadService);
3173
3192
  _transmitConcurrentSafe;
3174
3193
  _gesdemSaveSubscription = null;
3194
+ _isNavigatingToNextPage = false;
3175
3195
  _registerNgModelService = inject(RegisterNgModelService);
3176
3196
  _pageTitle = new Subject();
3177
3197
  // ECMAScript private field: cannot collide with a member of the pages extending this class.
@@ -3253,6 +3273,9 @@ class AbstractPageComponent {
3253
3273
  });
3254
3274
  }
3255
3275
  send(goToNextPage = true, displaySuccessMessage = true) {
3276
+ if (this._isNavigatingToNextPage) {
3277
+ return;
3278
+ }
3256
3279
  const hasPendingFiles = this._pendingUploadService.hasPendingFiles();
3257
3280
  if (hasPendingFiles) {
3258
3281
  goToNextPage = false;
@@ -3277,6 +3300,9 @@ class AbstractPageComponent {
3277
3300
  }
3278
3301
  }
3279
3302
  transmit() {
3303
+ if (this._isNavigatingToNextPage) {
3304
+ return;
3305
+ }
3280
3306
  this._validationHandlerService.shouldDisplayErrors(true);
3281
3307
  this._transmitConcurrentSafe
3282
3308
  .pipe(tap(() => this._eventsLoggerService.addEvent(SdkEventType.TRANSMIT)), catchError((error) => {
@@ -3288,11 +3314,14 @@ class AbstractPageComponent {
3288
3314
  // Do not show warning alert on closing tab or navigator when form has been transmitted
3289
3315
  this._registerNgModelService.setHasInteractions(false);
3290
3316
  this._gesdemEventService.formTransmittedSubject.next(this._gesdemService.lastResponse);
3291
- this._navigation.next();
3317
+ this.navigateToNextPage();
3292
3318
  }
3293
3319
  });
3294
3320
  }
3295
3321
  sendAndTransmit(displaySuccessMessage = true) {
3322
+ if (this._isNavigatingToNextPage) {
3323
+ return;
3324
+ }
3296
3325
  this._gesdemEventService
3297
3326
  .formSentObservable()
3298
3327
  .pipe(first())
@@ -3338,13 +3367,33 @@ class AbstractPageComponent {
3338
3367
  this._gesdemEventService.formSentSubject.next(this._gesdemService.lastResponse);
3339
3368
  const foehnFormComponentVal = this.foehnFormComponent();
3340
3369
  if (isValid && goToNextPage) {
3341
- this._navigation.next();
3370
+ this.navigateToNextPage();
3342
3371
  }
3343
3372
  else if (!isValid && foehnFormComponentVal) {
3344
3373
  foehnFormComponentVal.focusErrorSummary();
3345
3374
  }
3346
3375
  }, console.error);
3347
3376
  }
3377
+ /**
3378
+ * Navigates to the next page and ignores send(), sendAndTransmit() and transmit() until the navigation ends.
3379
+ *
3380
+ * The current page stays displayed and clickable while the next one is activated (e.g. lazy loaded route,
3381
+ * resolver or async guard): a second click on "next" would save again, then navigate once more from the
3382
+ * next page and skip it.
3383
+ */
3384
+ async navigateToNextPage() {
3385
+ if (this._isNavigatingToNextPage) {
3386
+ return;
3387
+ }
3388
+ this._isNavigatingToNextPage = true;
3389
+ try {
3390
+ await this._navigation.next();
3391
+ }
3392
+ finally {
3393
+ // Released when the navigation is cancelled or fails so that the user can try again.
3394
+ this._isNavigatingToNextPage = false;
3395
+ }
3396
+ }
3348
3397
  checkHasPendingsFilesBeforeTransmit() {
3349
3398
  if (this._pendingUploadService.hasPendingFiles()) {
3350
3399
  this._pendingUploadService.attachmentsUploaded
@@ -3818,7 +3867,10 @@ class FoehnFeedbackNotificationComponent {
3818
3867
  .post(`api/feedbacknotification/queryparams/${reference}`, fbu, {
3819
3868
  responseType: 'text',
3820
3869
  })
3821
- .pipe(map((cryptedUrlParams) => `${feedBackFormBaseUrl}?q=${encodeURIComponent(cryptedUrlParams)}`));
3870
+ .pipe(map((cryptedUrlParams) => `${feedBackFormBaseUrl}?q=${encodeURIComponent(cryptedUrlParams)}`), catchError((e) => {
3871
+ console.error('Unable to get the feedback url, returning null', e);
3872
+ return of(null);
3873
+ }));
3822
3874
  }
3823
3875
  getCategory(sessionInfoData, etapeInfo) {
3824
3876
  if (sessionInfoData?.categories) {
@@ -9993,7 +10045,7 @@ class FoehnInputEmailComponent extends FoehnInputStringComponent {
9993
10045
  this.helpModal.set({
9994
10046
  title: modalTitle,
9995
10047
  body: modalContent,
9996
- modalSize: 'modal-xs',
10048
+ modalSize: 'modal-md',
9997
10049
  });
9998
10050
  }
9999
10051
  if (this.standardHelpText() === undefined) {
@@ -12518,11 +12570,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImpo
12518
12570
  args: [{ selector: 'sdk-pending-payment', imports: [FoehnModalComponent, SdkDictionaryPipe], template: "<foehn-modal\n [closeable]=\"false\"\n [modalHeaderText]=\"'epayment.pending-payment.title' | fromDictionary\"\n [isModalVisible]=\"isModalVisible\"\n (isModalVisibleChange)=\"isModalVisible = $event\"\n modalSize=\"modal-lg\"\n>\n <div class=\"modal-body\">\n <p>{{ 'epayment.pending-payment.text' | fromDictionary }}</p>\n </div>\n <div modal-footer class=\"w-100\">\n <div class=\"d-flex\">\n <button\n id=\"goToPayerButton\"\n type=\"button\"\n class=\"btn btn-primary ms-auto\"\n (click)=\"goToPayer()\"\n >\n {{ 'epayment.pending-payment.button' | fromDictionary }}\n </button>\n </div>\n </div>\n</foehn-modal>\n" }]
12519
12571
  }], propDecorators: { onPay: [{ type: i0.Output, args: ["onPay"] }] } });
12520
12572
 
12573
+ // The loading state isn't displayed when the target page loads quickly, so that it doesn't flicker.
12574
+ const LOADING_DISPLAY_DELAY_MS = 200;
12521
12575
  class AbstractFoehnNavigationComponent {
12522
12576
  showContinueLaterButton = input(true, ...(ngDevMode ? [{ debugName: "showContinueLaterButton" }] : /* istanbul ignore next */ []));
12523
12577
  showNextButton = input(true, ...(ngDevMode ? [{ debugName: "showNextButton" }] : /* istanbul ignore next */ []));
12524
12578
  nextLabel = input('foehn-navigation.next.label', ...(ngDevMode ? [{ debugName: "nextLabel" }] : /* istanbul ignore next */ []));
12525
12579
  prevLabel = input('foehn-navigation.previous.label', ...(ngDevMode ? [{ debugName: "prevLabel" }] : /* istanbul ignore next */ []));
12580
+ loadingLabel = input('foehn-navigation.loading.label', ...(ngDevMode ? [{ debugName: "loadingLabel" }] : /* istanbul ignore next */ []));
12526
12581
  continueLaterLabel = input('foehn-navigation.continue-later.label', ...(ngDevMode ? [{ debugName: "continueLaterLabel" }] : /* istanbul ignore next */ []));
12527
12582
  continueLaterAlreadyRegisteredLabel = input('foehn-navigation.continue-later-already-registered.label', ...(ngDevMode ? [{ debugName: "continueLaterAlreadyRegisteredLabel" }] : /* istanbul ignore next */ []));
12528
12583
  continueLaterConnectedLabel = input('foehn-navigation.continue-later-connected.label', ...(ngDevMode ? [{ debugName: "continueLaterConnectedLabel" }] : /* istanbul ignore next */ []));
@@ -12531,21 +12586,46 @@ class AbstractFoehnNavigationComponent {
12531
12586
  onNext = output();
12532
12587
  // eslint-disable-next-line @angular-eslint/no-output-on-prefix
12533
12588
  onPrevious = output();
12589
+ pendingNavigationDirection;
12590
+ loadingDirection;
12591
+ isNavigating = computed(() => this.pendingNavigationDirection() !== null, ...(ngDevMode ? [{ debugName: "isNavigating" }] : /* istanbul ignore next */ []));
12592
+ isLoading = computed(() => this.loadingDirection() !== null, ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
12593
+ isLoadingNext = computed(() => this.loadingDirection() === NavigationDirection.FORWARD, ...(ngDevMode ? [{ debugName: "isLoadingNext" }] : /* istanbul ignore next */ []));
12594
+ isLoadingPrevious = computed(() => this.loadingDirection() === NavigationDirection.BACKWARD, ...(ngDevMode ? [{ debugName: "isLoadingPrevious" }] : /* istanbul ignore next */ []));
12595
+ constructor() {
12596
+ const pendingNavigationDirection = inject(FoehnNavigationService)
12597
+ .pendingNavigationDirection()
12598
+ .pipe(
12599
+ // A navigation pending when the component is created is the one activating its page.
12600
+ skip(1));
12601
+ this.pendingNavigationDirection = toSignal(pendingNavigationDirection, {
12602
+ initialValue: null,
12603
+ });
12604
+ this.loadingDirection = toSignal(pendingNavigationDirection.pipe(switchMap((direction) => direction === null
12605
+ ? of(null)
12606
+ : timer(LOADING_DISPLAY_DELAY_MS).pipe(map(() => direction)))), { initialValue: null });
12607
+ }
12534
12608
  goToNext() {
12609
+ if (this.isNavigating()) {
12610
+ return;
12611
+ }
12535
12612
  this.onNext.emit();
12536
12613
  }
12537
12614
  goToPrevious() {
12615
+ if (this.isNavigating()) {
12616
+ return;
12617
+ }
12538
12618
  this.onPrevious.emit();
12539
12619
  }
12540
12620
  canShowNextButton() {
12541
12621
  return this.showNextButton();
12542
12622
  }
12543
12623
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: AbstractFoehnNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
12544
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.23", type: AbstractFoehnNavigationComponent, isStandalone: true, inputs: { showContinueLaterButton: { classPropertyName: "showContinueLaterButton", publicName: "showContinueLaterButton", isSignal: true, isRequired: false, transformFunction: null }, showNextButton: { classPropertyName: "showNextButton", publicName: "showNextButton", isSignal: true, isRequired: false, transformFunction: null }, nextLabel: { classPropertyName: "nextLabel", publicName: "nextLabel", isSignal: true, isRequired: false, transformFunction: null }, prevLabel: { classPropertyName: "prevLabel", publicName: "prevLabel", isSignal: true, isRequired: false, transformFunction: null }, continueLaterLabel: { classPropertyName: "continueLaterLabel", publicName: "continueLaterLabel", isSignal: true, isRequired: false, transformFunction: null }, continueLaterAlreadyRegisteredLabel: { classPropertyName: "continueLaterAlreadyRegisteredLabel", publicName: "continueLaterAlreadyRegisteredLabel", isSignal: true, isRequired: false, transformFunction: null }, continueLaterConnectedLabel: { classPropertyName: "continueLaterConnectedLabel", publicName: "continueLaterConnectedLabel", isSignal: true, isRequired: false, transformFunction: null }, triggerRecoveryOnPageChange: { classPropertyName: "triggerRecoveryOnPageChange", publicName: "triggerRecoveryOnPageChange", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onNext: "onNext", onPrevious: "onPrevious" }, ngImport: i0 });
12624
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.23", type: AbstractFoehnNavigationComponent, isStandalone: true, inputs: { showContinueLaterButton: { classPropertyName: "showContinueLaterButton", publicName: "showContinueLaterButton", isSignal: true, isRequired: false, transformFunction: null }, showNextButton: { classPropertyName: "showNextButton", publicName: "showNextButton", isSignal: true, isRequired: false, transformFunction: null }, nextLabel: { classPropertyName: "nextLabel", publicName: "nextLabel", isSignal: true, isRequired: false, transformFunction: null }, prevLabel: { classPropertyName: "prevLabel", publicName: "prevLabel", isSignal: true, isRequired: false, transformFunction: null }, loadingLabel: { classPropertyName: "loadingLabel", publicName: "loadingLabel", isSignal: true, isRequired: false, transformFunction: null }, continueLaterLabel: { classPropertyName: "continueLaterLabel", publicName: "continueLaterLabel", isSignal: true, isRequired: false, transformFunction: null }, continueLaterAlreadyRegisteredLabel: { classPropertyName: "continueLaterAlreadyRegisteredLabel", publicName: "continueLaterAlreadyRegisteredLabel", isSignal: true, isRequired: false, transformFunction: null }, continueLaterConnectedLabel: { classPropertyName: "continueLaterConnectedLabel", publicName: "continueLaterConnectedLabel", isSignal: true, isRequired: false, transformFunction: null }, triggerRecoveryOnPageChange: { classPropertyName: "triggerRecoveryOnPageChange", publicName: "triggerRecoveryOnPageChange", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onNext: "onNext", onPrevious: "onPrevious" }, ngImport: i0 });
12545
12625
  }
12546
12626
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: AbstractFoehnNavigationComponent, decorators: [{
12547
12627
  type: Directive
12548
- }], propDecorators: { showContinueLaterButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showContinueLaterButton", required: false }] }], showNextButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showNextButton", required: false }] }], nextLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextLabel", required: false }] }], prevLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "prevLabel", required: false }] }], continueLaterLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "continueLaterLabel", required: false }] }], continueLaterAlreadyRegisteredLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "continueLaterAlreadyRegisteredLabel", required: false }] }], continueLaterConnectedLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "continueLaterConnectedLabel", required: false }] }], triggerRecoveryOnPageChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerRecoveryOnPageChange", required: false }] }], onNext: [{ type: i0.Output, args: ["onNext"] }], onPrevious: [{ type: i0.Output, args: ["onPrevious"] }] } });
12628
+ }], ctorParameters: () => [], propDecorators: { showContinueLaterButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showContinueLaterButton", required: false }] }], showNextButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showNextButton", required: false }] }], nextLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "nextLabel", required: false }] }], prevLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "prevLabel", required: false }] }], loadingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingLabel", required: false }] }], continueLaterLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "continueLaterLabel", required: false }] }], continueLaterAlreadyRegisteredLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "continueLaterAlreadyRegisteredLabel", required: false }] }], continueLaterConnectedLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "continueLaterConnectedLabel", required: false }] }], triggerRecoveryOnPageChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerRecoveryOnPageChange", required: false }] }], onNext: [{ type: i0.Output, args: ["onNext"] }], onPrevious: [{ type: i0.Output, args: ["onPrevious"] }] } });
12549
12629
 
12550
12630
  class FoehnNavigationComponent extends AbstractFoehnNavigationComponent {
12551
12631
  transmitLabel = input('foehn-navigation.transmit.label', ...(ngDevMode ? [{ debugName: "transmitLabel" }] : /* istanbul ignore next */ []));
@@ -12592,7 +12672,7 @@ class FoehnNavigationComponent extends AbstractFoehnNavigationComponent {
12592
12672
  return this.navigationService.isLinearRouting();
12593
12673
  }
12594
12674
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: FoehnNavigationComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
12595
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.23", type: FoehnNavigationComponent, isStandalone: true, selector: "foehn-navigation", inputs: { transmitLabel: { classPropertyName: "transmitLabel", publicName: "transmitLabel", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "@if (showContinueLaterButton()) {\n <gesdem-action-recovery-registration\n [continueLaterLabel]=\"continueLaterLabel()\"\n [continueLaterAlreadyRegisteredLabel]=\"\n continueLaterAlreadyRegisteredLabel()\n \"\n [continueLaterConnectedLabel]=\"continueLaterConnectedLabel()\"\n [triggerOnPageChange]=\"triggerRecoveryOnPageChange()\"\n />\n}\n\n@if (isForcedOnRecapForPendingPayment()) {\n <sdk-pending-payment (onPay)=\"goToNext()\" />\n}\n\n<nav class=\"vd-pagination\" id=\"foehn_navContainer\" aria-label=\"Pagination\">\n <ul class=\"vd-pagination__list\">\n @if (canShowPreviousButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--previous\">\n <button\n id=\"prevButton\"\n type=\"button\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n (click)=\"$event.preventDefault(); goToPrevious()\"\n >\n <span class=\"vd-pagination__title\">\n <foehn-icon-chevron-left\n class=\"me-1\"\n aria-hidden=\"true\"\n />\n {{ prevLabel() | fromDictionary }}\n </span>\n @if (isLinearRouting()) {\n <span class=\"visually-hidden\">:</span>\n <span class=\"vd-pagination__label\">\n {{ getPreviousRouteIndex() }}\n {{\n 'foehn-navigation.route.index.separator'\n | fromDictionary\n }}\n {{ getTotalRoutesSize() }}\n </span>\n }\n </button>\n </li>\n }\n @if (!isLastFormPage() && canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n (click)=\"$event.preventDefault(); goToNext()\"\n >\n <span class=\"vd-pagination__title\">\n {{ nextLabel() | fromDictionary }}\n <foehn-icon-chevron-right\n class=\"ms-1\"\n aria-hidden=\"true\"\n />\n </span>\n @if (isLinearRouting()) {\n <span class=\"visually-hidden\">:</span>\n <span class=\"vd-pagination__label\">\n {{ getNextRouteIndex() }}\n {{\n 'foehn-navigation.route.index.separator'\n | fromDictionary\n }}\n {{ getTotalRoutesSize() }}\n </span>\n }\n </button>\n </li>\n }\n @if (isLastFormPage() && canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n @if (isLastFormPage() && canShowNextButton()) {\n <button\n type=\"submit\"\n id=\"transmitButton\"\n (click)=\"goToNext()\"\n class=\"btn btn-success vd-btn-pagination-submit\"\n >\n {{ transmitLabel() | fromDictionary }}\n </button>\n }\n </li>\n }\n </ul>\n</nav>\n", styles: [".vd-pagination__link-reset{background:none;border:none;font-weight:inherit;text-decoration-line:none;text-align:inherit;cursor:pointer}.vd-pagination__link-reset:focus{background-color:var(--vd-focus)}:host ::ng-deep .btn.btn-link .svg-inline--fa{color:var(--vd-primary-dark)}:host ::ng-deep .btn.btn-link:hover .svg-inline--fa{color:var(--vd-neutral-dark)}.btn.btn-link{text-transform:none}\n"], dependencies: [{ kind: "component", type: GesdemActionRecoveryRegistrationComponent, selector: "gesdem-action-recovery-registration", inputs: ["dispatchFormErrors", "continueLaterLabel", "continueLaterAlreadyRegisteredLabel", "continueLaterConnectedLabel", "triggerOnPageChange"] }, { kind: "component", type: PendingPaymentComponent, selector: "sdk-pending-payment", outputs: ["onPay"] }, { kind: "component", type: FoehnIconChevronLeftComponent, selector: "foehn-icon-chevron-left" }, { kind: "component", type: FoehnIconChevronRightComponent, selector: "foehn-icon-chevron-right" }, { kind: "pipe", type: SdkDictionaryPipe, name: "fromDictionary" }] });
12675
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.23", type: FoehnNavigationComponent, isStandalone: true, selector: "foehn-navigation", inputs: { transmitLabel: { classPropertyName: "transmitLabel", publicName: "transmitLabel", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "@if (showContinueLaterButton()) {\n <gesdem-action-recovery-registration\n [continueLaterLabel]=\"continueLaterLabel()\"\n [continueLaterAlreadyRegisteredLabel]=\"\n continueLaterAlreadyRegisteredLabel()\n \"\n [continueLaterConnectedLabel]=\"continueLaterConnectedLabel()\"\n [triggerOnPageChange]=\"triggerRecoveryOnPageChange()\"\n />\n}\n\n@if (isForcedOnRecapForPendingPayment()) {\n <sdk-pending-payment (onPay)=\"goToNext()\" />\n}\n\n<nav class=\"vd-pagination\" id=\"foehn_navContainer\" aria-label=\"Pagination\">\n <ul class=\"vd-pagination__list\">\n @if (canShowPreviousButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--previous\">\n <button\n id=\"prevButton\"\n type=\"button\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n [class.disabled]=\"isLoading()\"\n [attr.aria-disabled]=\"isLoading() || null\"\n (click)=\"$event.preventDefault(); goToPrevious()\"\n >\n <span class=\"vd-pagination__title\">\n @if (isLoadingPrevious()) {\n <span\n class=\"spinner-border spinner-border-sm me-1\"\n aria-hidden=\"true\"\n ></span>\n {{ loadingLabel() | fromDictionary }}\n } @else {\n <foehn-icon-chevron-left\n class=\"me-1\"\n aria-hidden=\"true\"\n />\n {{ prevLabel() | fromDictionary }}\n }\n </span>\n @if (isLinearRouting()) {\n <span class=\"visually-hidden\">:</span>\n <span class=\"vd-pagination__label\">\n {{ getPreviousRouteIndex() }}\n {{\n 'foehn-navigation.route.index.separator'\n | fromDictionary\n }}\n {{ getTotalRoutesSize() }}\n </span>\n }\n </button>\n </li>\n }\n @if (!isLastFormPage() && canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n [class.disabled]=\"isLoading()\"\n [attr.aria-disabled]=\"isLoading() || null\"\n (click)=\"$event.preventDefault(); goToNext()\"\n >\n <span class=\"vd-pagination__title\">\n @if (isLoadingNext()) {\n <span\n class=\"spinner-border spinner-border-sm me-1\"\n aria-hidden=\"true\"\n ></span>\n {{ loadingLabel() | fromDictionary }}\n } @else {\n {{ nextLabel() | fromDictionary }}\n <foehn-icon-chevron-right\n class=\"ms-1\"\n aria-hidden=\"true\"\n />\n }\n </span>\n @if (isLinearRouting()) {\n <span class=\"visually-hidden\">:</span>\n <span class=\"vd-pagination__label\">\n {{ getNextRouteIndex() }}\n {{\n 'foehn-navigation.route.index.separator'\n | fromDictionary\n }}\n {{ getTotalRoutesSize() }}\n </span>\n }\n </button>\n </li>\n }\n @if (isLastFormPage() && canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n @if (isLastFormPage() && canShowNextButton()) {\n <button\n type=\"submit\"\n id=\"transmitButton\"\n (click)=\"goToNext()\"\n class=\"btn btn-success vd-btn-pagination-submit\"\n [class.disabled]=\"isLoading()\"\n [attr.aria-disabled]=\"isLoading() || null\"\n >\n @if (isLoadingNext()) {\n <span\n class=\"spinner-border spinner-border-sm me-1\"\n aria-hidden=\"true\"\n ></span>\n {{ loadingLabel() | fromDictionary }}\n } @else {\n {{ transmitLabel() | fromDictionary }}\n }\n </button>\n }\n </li>\n }\n </ul>\n <output class=\"visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">\n @if (isLoading()) {\n {{ loadingLabel() | fromDictionary }}\n }\n </output>\n</nav>\n", styles: [".vd-pagination__link-reset{background:none;border:none;font-weight:inherit;text-decoration-line:none;text-align:inherit;cursor:pointer}.vd-pagination__link-reset:focus{background-color:var(--vd-focus)}:host ::ng-deep .btn.btn-link .svg-inline--fa{color:var(--vd-primary-dark)}:host ::ng-deep .btn.btn-link:hover .svg-inline--fa{color:var(--vd-neutral-dark)}.btn.btn-link{text-transform:none}\n"], dependencies: [{ kind: "component", type: GesdemActionRecoveryRegistrationComponent, selector: "gesdem-action-recovery-registration", inputs: ["dispatchFormErrors", "continueLaterLabel", "continueLaterAlreadyRegisteredLabel", "continueLaterConnectedLabel", "triggerOnPageChange"] }, { kind: "component", type: PendingPaymentComponent, selector: "sdk-pending-payment", outputs: ["onPay"] }, { kind: "component", type: FoehnIconChevronLeftComponent, selector: "foehn-icon-chevron-left" }, { kind: "component", type: FoehnIconChevronRightComponent, selector: "foehn-icon-chevron-right" }, { kind: "pipe", type: SdkDictionaryPipe, name: "fromDictionary" }] });
12596
12676
  }
12597
12677
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: FoehnNavigationComponent, decorators: [{
12598
12678
  type: Component,
@@ -12602,7 +12682,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImpo
12602
12682
  FoehnIconChevronLeftComponent,
12603
12683
  FoehnIconChevronRightComponent,
12604
12684
  SdkDictionaryPipe,
12605
- ], template: "@if (showContinueLaterButton()) {\n <gesdem-action-recovery-registration\n [continueLaterLabel]=\"continueLaterLabel()\"\n [continueLaterAlreadyRegisteredLabel]=\"\n continueLaterAlreadyRegisteredLabel()\n \"\n [continueLaterConnectedLabel]=\"continueLaterConnectedLabel()\"\n [triggerOnPageChange]=\"triggerRecoveryOnPageChange()\"\n />\n}\n\n@if (isForcedOnRecapForPendingPayment()) {\n <sdk-pending-payment (onPay)=\"goToNext()\" />\n}\n\n<nav class=\"vd-pagination\" id=\"foehn_navContainer\" aria-label=\"Pagination\">\n <ul class=\"vd-pagination__list\">\n @if (canShowPreviousButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--previous\">\n <button\n id=\"prevButton\"\n type=\"button\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n (click)=\"$event.preventDefault(); goToPrevious()\"\n >\n <span class=\"vd-pagination__title\">\n <foehn-icon-chevron-left\n class=\"me-1\"\n aria-hidden=\"true\"\n />\n {{ prevLabel() | fromDictionary }}\n </span>\n @if (isLinearRouting()) {\n <span class=\"visually-hidden\">:</span>\n <span class=\"vd-pagination__label\">\n {{ getPreviousRouteIndex() }}\n {{\n 'foehn-navigation.route.index.separator'\n | fromDictionary\n }}\n {{ getTotalRoutesSize() }}\n </span>\n }\n </button>\n </li>\n }\n @if (!isLastFormPage() && canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n (click)=\"$event.preventDefault(); goToNext()\"\n >\n <span class=\"vd-pagination__title\">\n {{ nextLabel() | fromDictionary }}\n <foehn-icon-chevron-right\n class=\"ms-1\"\n aria-hidden=\"true\"\n />\n </span>\n @if (isLinearRouting()) {\n <span class=\"visually-hidden\">:</span>\n <span class=\"vd-pagination__label\">\n {{ getNextRouteIndex() }}\n {{\n 'foehn-navigation.route.index.separator'\n | fromDictionary\n }}\n {{ getTotalRoutesSize() }}\n </span>\n }\n </button>\n </li>\n }\n @if (isLastFormPage() && canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n @if (isLastFormPage() && canShowNextButton()) {\n <button\n type=\"submit\"\n id=\"transmitButton\"\n (click)=\"goToNext()\"\n class=\"btn btn-success vd-btn-pagination-submit\"\n >\n {{ transmitLabel() | fromDictionary }}\n </button>\n }\n </li>\n }\n </ul>\n</nav>\n", styles: [".vd-pagination__link-reset{background:none;border:none;font-weight:inherit;text-decoration-line:none;text-align:inherit;cursor:pointer}.vd-pagination__link-reset:focus{background-color:var(--vd-focus)}:host ::ng-deep .btn.btn-link .svg-inline--fa{color:var(--vd-primary-dark)}:host ::ng-deep .btn.btn-link:hover .svg-inline--fa{color:var(--vd-neutral-dark)}.btn.btn-link{text-transform:none}\n"] }]
12685
+ ], template: "@if (showContinueLaterButton()) {\n <gesdem-action-recovery-registration\n [continueLaterLabel]=\"continueLaterLabel()\"\n [continueLaterAlreadyRegisteredLabel]=\"\n continueLaterAlreadyRegisteredLabel()\n \"\n [continueLaterConnectedLabel]=\"continueLaterConnectedLabel()\"\n [triggerOnPageChange]=\"triggerRecoveryOnPageChange()\"\n />\n}\n\n@if (isForcedOnRecapForPendingPayment()) {\n <sdk-pending-payment (onPay)=\"goToNext()\" />\n}\n\n<nav class=\"vd-pagination\" id=\"foehn_navContainer\" aria-label=\"Pagination\">\n <ul class=\"vd-pagination__list\">\n @if (canShowPreviousButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--previous\">\n <button\n id=\"prevButton\"\n type=\"button\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n [class.disabled]=\"isLoading()\"\n [attr.aria-disabled]=\"isLoading() || null\"\n (click)=\"$event.preventDefault(); goToPrevious()\"\n >\n <span class=\"vd-pagination__title\">\n @if (isLoadingPrevious()) {\n <span\n class=\"spinner-border spinner-border-sm me-1\"\n aria-hidden=\"true\"\n ></span>\n {{ loadingLabel() | fromDictionary }}\n } @else {\n <foehn-icon-chevron-left\n class=\"me-1\"\n aria-hidden=\"true\"\n />\n {{ prevLabel() | fromDictionary }}\n }\n </span>\n @if (isLinearRouting()) {\n <span class=\"visually-hidden\">:</span>\n <span class=\"vd-pagination__label\">\n {{ getPreviousRouteIndex() }}\n {{\n 'foehn-navigation.route.index.separator'\n | fromDictionary\n }}\n {{ getTotalRoutesSize() }}\n </span>\n }\n </button>\n </li>\n }\n @if (!isLastFormPage() && canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n [class.disabled]=\"isLoading()\"\n [attr.aria-disabled]=\"isLoading() || null\"\n (click)=\"$event.preventDefault(); goToNext()\"\n >\n <span class=\"vd-pagination__title\">\n @if (isLoadingNext()) {\n <span\n class=\"spinner-border spinner-border-sm me-1\"\n aria-hidden=\"true\"\n ></span>\n {{ loadingLabel() | fromDictionary }}\n } @else {\n {{ nextLabel() | fromDictionary }}\n <foehn-icon-chevron-right\n class=\"ms-1\"\n aria-hidden=\"true\"\n />\n }\n </span>\n @if (isLinearRouting()) {\n <span class=\"visually-hidden\">:</span>\n <span class=\"vd-pagination__label\">\n {{ getNextRouteIndex() }}\n {{\n 'foehn-navigation.route.index.separator'\n | fromDictionary\n }}\n {{ getTotalRoutesSize() }}\n </span>\n }\n </button>\n </li>\n }\n @if (isLastFormPage() && canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n @if (isLastFormPage() && canShowNextButton()) {\n <button\n type=\"submit\"\n id=\"transmitButton\"\n (click)=\"goToNext()\"\n class=\"btn btn-success vd-btn-pagination-submit\"\n [class.disabled]=\"isLoading()\"\n [attr.aria-disabled]=\"isLoading() || null\"\n >\n @if (isLoadingNext()) {\n <span\n class=\"spinner-border spinner-border-sm me-1\"\n aria-hidden=\"true\"\n ></span>\n {{ loadingLabel() | fromDictionary }}\n } @else {\n {{ transmitLabel() | fromDictionary }}\n }\n </button>\n }\n </li>\n }\n </ul>\n <output class=\"visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">\n @if (isLoading()) {\n {{ loadingLabel() | fromDictionary }}\n }\n </output>\n</nav>\n", styles: [".vd-pagination__link-reset{background:none;border:none;font-weight:inherit;text-decoration-line:none;text-align:inherit;cursor:pointer}.vd-pagination__link-reset:focus{background-color:var(--vd-focus)}:host ::ng-deep .btn.btn-link .svg-inline--fa{color:var(--vd-primary-dark)}:host ::ng-deep .btn.btn-link:hover .svg-inline--fa{color:var(--vd-neutral-dark)}.btn.btn-link{text-transform:none}\n"] }]
12606
12686
  }], propDecorators: { transmitLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "transmitLabel", required: false }] }] } });
12607
12687
 
12608
12688
  class FoehnSimpleNavigationComponent extends AbstractFoehnNavigationComponent {
@@ -12611,7 +12691,7 @@ class FoehnSimpleNavigationComponent extends AbstractFoehnNavigationComponent {
12611
12691
  return this.showPreviousButton();
12612
12692
  }
12613
12693
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: FoehnSimpleNavigationComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
12614
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.23", type: FoehnSimpleNavigationComponent, isStandalone: true, selector: "foehn-simple-navigation", inputs: { showPreviousButton: { classPropertyName: "showPreviousButton", publicName: "showPreviousButton", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "@if (showContinueLaterButton()) {\n <gesdem-action-recovery-registration\n [continueLaterLabel]=\"continueLaterLabel()\"\n [continueLaterAlreadyRegisteredLabel]=\"\n continueLaterAlreadyRegisteredLabel()\n \"\n [continueLaterConnectedLabel]=\"continueLaterConnectedLabel()\"\n [triggerOnPageChange]=\"triggerRecoveryOnPageChange()\"\n />\n}\n\n<nav class=\"vd-pagination\" id=\"foehn_navContainer\" aria-label=\"Pagination\">\n <ul class=\"vd-pagination__list\">\n @if (canShowPreviousButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--previous\">\n <button\n id=\"prevButton\"\n type=\"button\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n (click)=\"$event.preventDefault(); goToPrevious()\"\n >\n <span class=\"vd-pagination__title\">\n <foehn-icon-chevron-left\n class=\"me-1\"\n aria-hidden=\"true\"\n />\n {{ prevLabel() | fromDictionary }}\n </span>\n </button>\n </li>\n }\n @if (canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n (click)=\"$event.preventDefault(); goToNext()\"\n >\n <span class=\"vd-pagination__title\">\n {{ nextLabel() | fromDictionary }}\n <foehn-icon-chevron-right\n class=\"ms-1\"\n aria-hidden=\"true\"\n />\n </span>\n </button>\n </li>\n }\n </ul>\n</nav>\n", styles: [".vd-pagination__link-reset{background:none;border:none;font-weight:inherit;text-decoration-line:none;text-align:inherit;cursor:pointer}.vd-pagination__link-reset:focus{background-color:var(--vd-focus)}:host ::ng-deep .btn.btn-link .svg-inline--fa{color:var(--vd-primary-dark)}:host ::ng-deep .btn.btn-link:hover .svg-inline--fa{color:var(--vd-neutral-dark)}.btn.btn-link{text-transform:none}\n"], dependencies: [{ kind: "component", type: GesdemActionRecoveryRegistrationComponent, selector: "gesdem-action-recovery-registration", inputs: ["dispatchFormErrors", "continueLaterLabel", "continueLaterAlreadyRegisteredLabel", "continueLaterConnectedLabel", "triggerOnPageChange"] }, { kind: "component", type: FoehnIconChevronLeftComponent, selector: "foehn-icon-chevron-left" }, { kind: "component", type: FoehnIconChevronRightComponent, selector: "foehn-icon-chevron-right" }, { kind: "pipe", type: SdkDictionaryPipe, name: "fromDictionary" }] });
12694
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.23", type: FoehnSimpleNavigationComponent, isStandalone: true, selector: "foehn-simple-navigation", inputs: { showPreviousButton: { classPropertyName: "showPreviousButton", publicName: "showPreviousButton", isSignal: true, isRequired: false, transformFunction: null } }, usesInheritance: true, ngImport: i0, template: "@if (showContinueLaterButton()) {\n <gesdem-action-recovery-registration\n [continueLaterLabel]=\"continueLaterLabel()\"\n [continueLaterAlreadyRegisteredLabel]=\"\n continueLaterAlreadyRegisteredLabel()\n \"\n [continueLaterConnectedLabel]=\"continueLaterConnectedLabel()\"\n [triggerOnPageChange]=\"triggerRecoveryOnPageChange()\"\n />\n}\n\n<nav class=\"vd-pagination\" id=\"foehn_navContainer\" aria-label=\"Pagination\">\n <ul class=\"vd-pagination__list\">\n @if (canShowPreviousButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--previous\">\n <button\n id=\"prevButton\"\n type=\"button\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n [class.disabled]=\"isLoading()\"\n [attr.aria-disabled]=\"isLoading() || null\"\n (click)=\"$event.preventDefault(); goToPrevious()\"\n >\n <span class=\"vd-pagination__title\">\n @if (isLoadingPrevious()) {\n <span\n class=\"spinner-border spinner-border-sm me-1\"\n aria-hidden=\"true\"\n ></span>\n {{ loadingLabel() | fromDictionary }}\n } @else {\n <foehn-icon-chevron-left\n class=\"me-1\"\n aria-hidden=\"true\"\n />\n {{ prevLabel() | fromDictionary }}\n }\n </span>\n </button>\n </li>\n }\n @if (canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n [class.disabled]=\"isLoading()\"\n [attr.aria-disabled]=\"isLoading() || null\"\n (click)=\"$event.preventDefault(); goToNext()\"\n >\n <span class=\"vd-pagination__title\">\n @if (isLoadingNext()) {\n <span\n class=\"spinner-border spinner-border-sm me-1\"\n aria-hidden=\"true\"\n ></span>\n {{ loadingLabel() | fromDictionary }}\n } @else {\n {{ nextLabel() | fromDictionary }}\n <foehn-icon-chevron-right\n class=\"ms-1\"\n aria-hidden=\"true\"\n />\n }\n </span>\n </button>\n </li>\n }\n </ul>\n <output class=\"visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">\n @if (isLoading()) {\n {{ loadingLabel() | fromDictionary }}\n }\n </output>\n</nav>\n", styles: [".vd-pagination__link-reset{background:none;border:none;font-weight:inherit;text-decoration-line:none;text-align:inherit;cursor:pointer}.vd-pagination__link-reset:focus{background-color:var(--vd-focus)}:host ::ng-deep .btn.btn-link .svg-inline--fa{color:var(--vd-primary-dark)}:host ::ng-deep .btn.btn-link:hover .svg-inline--fa{color:var(--vd-neutral-dark)}.btn.btn-link{text-transform:none}\n"], dependencies: [{ kind: "component", type: GesdemActionRecoveryRegistrationComponent, selector: "gesdem-action-recovery-registration", inputs: ["dispatchFormErrors", "continueLaterLabel", "continueLaterAlreadyRegisteredLabel", "continueLaterConnectedLabel", "triggerOnPageChange"] }, { kind: "component", type: FoehnIconChevronLeftComponent, selector: "foehn-icon-chevron-left" }, { kind: "component", type: FoehnIconChevronRightComponent, selector: "foehn-icon-chevron-right" }, { kind: "pipe", type: SdkDictionaryPipe, name: "fromDictionary" }] });
12615
12695
  }
12616
12696
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: FoehnSimpleNavigationComponent, decorators: [{
12617
12697
  type: Component,
@@ -12620,7 +12700,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImpo
12620
12700
  FoehnIconChevronLeftComponent,
12621
12701
  FoehnIconChevronRightComponent,
12622
12702
  SdkDictionaryPipe,
12623
- ], template: "@if (showContinueLaterButton()) {\n <gesdem-action-recovery-registration\n [continueLaterLabel]=\"continueLaterLabel()\"\n [continueLaterAlreadyRegisteredLabel]=\"\n continueLaterAlreadyRegisteredLabel()\n \"\n [continueLaterConnectedLabel]=\"continueLaterConnectedLabel()\"\n [triggerOnPageChange]=\"triggerRecoveryOnPageChange()\"\n />\n}\n\n<nav class=\"vd-pagination\" id=\"foehn_navContainer\" aria-label=\"Pagination\">\n <ul class=\"vd-pagination__list\">\n @if (canShowPreviousButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--previous\">\n <button\n id=\"prevButton\"\n type=\"button\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n (click)=\"$event.preventDefault(); goToPrevious()\"\n >\n <span class=\"vd-pagination__title\">\n <foehn-icon-chevron-left\n class=\"me-1\"\n aria-hidden=\"true\"\n />\n {{ prevLabel() | fromDictionary }}\n </span>\n </button>\n </li>\n }\n @if (canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n (click)=\"$event.preventDefault(); goToNext()\"\n >\n <span class=\"vd-pagination__title\">\n {{ nextLabel() | fromDictionary }}\n <foehn-icon-chevron-right\n class=\"ms-1\"\n aria-hidden=\"true\"\n />\n </span>\n </button>\n </li>\n }\n </ul>\n</nav>\n", styles: [".vd-pagination__link-reset{background:none;border:none;font-weight:inherit;text-decoration-line:none;text-align:inherit;cursor:pointer}.vd-pagination__link-reset:focus{background-color:var(--vd-focus)}:host ::ng-deep .btn.btn-link .svg-inline--fa{color:var(--vd-primary-dark)}:host ::ng-deep .btn.btn-link:hover .svg-inline--fa{color:var(--vd-neutral-dark)}.btn.btn-link{text-transform:none}\n"] }]
12703
+ ], template: "@if (showContinueLaterButton()) {\n <gesdem-action-recovery-registration\n [continueLaterLabel]=\"continueLaterLabel()\"\n [continueLaterAlreadyRegisteredLabel]=\"\n continueLaterAlreadyRegisteredLabel()\n \"\n [continueLaterConnectedLabel]=\"continueLaterConnectedLabel()\"\n [triggerOnPageChange]=\"triggerRecoveryOnPageChange()\"\n />\n}\n\n<nav class=\"vd-pagination\" id=\"foehn_navContainer\" aria-label=\"Pagination\">\n <ul class=\"vd-pagination__list\">\n @if (canShowPreviousButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--previous\">\n <button\n id=\"prevButton\"\n type=\"button\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n [class.disabled]=\"isLoading()\"\n [attr.aria-disabled]=\"isLoading() || null\"\n (click)=\"$event.preventDefault(); goToPrevious()\"\n >\n <span class=\"vd-pagination__title\">\n @if (isLoadingPrevious()) {\n <span\n class=\"spinner-border spinner-border-sm me-1\"\n aria-hidden=\"true\"\n ></span>\n {{ loadingLabel() | fromDictionary }}\n } @else {\n <foehn-icon-chevron-left\n class=\"me-1\"\n aria-hidden=\"true\"\n />\n {{ prevLabel() | fromDictionary }}\n }\n </span>\n </button>\n </li>\n }\n @if (canShowNextButton()) {\n <li class=\"vd-pagination__item vd-pagination__item--next\">\n <button\n id=\"nextButton\"\n type=\"submit\"\n class=\"btn btn-link vd-pagination__link vd-pagination__link-reset\"\n [class.disabled]=\"isLoading()\"\n [attr.aria-disabled]=\"isLoading() || null\"\n (click)=\"$event.preventDefault(); goToNext()\"\n >\n <span class=\"vd-pagination__title\">\n @if (isLoadingNext()) {\n <span\n class=\"spinner-border spinner-border-sm me-1\"\n aria-hidden=\"true\"\n ></span>\n {{ loadingLabel() | fromDictionary }}\n } @else {\n {{ nextLabel() | fromDictionary }}\n <foehn-icon-chevron-right\n class=\"ms-1\"\n aria-hidden=\"true\"\n />\n }\n </span>\n </button>\n </li>\n }\n </ul>\n <output class=\"visually-hidden\" aria-live=\"polite\" aria-atomic=\"true\">\n @if (isLoading()) {\n {{ loadingLabel() | fromDictionary }}\n }\n </output>\n</nav>\n", styles: [".vd-pagination__link-reset{background:none;border:none;font-weight:inherit;text-decoration-line:none;text-align:inherit;cursor:pointer}.vd-pagination__link-reset:focus{background-color:var(--vd-focus)}:host ::ng-deep .btn.btn-link .svg-inline--fa{color:var(--vd-primary-dark)}:host ::ng-deep .btn.btn-link:hover .svg-inline--fa{color:var(--vd-neutral-dark)}.btn.btn-link{text-transform:none}\n"] }]
12624
12704
  }], propDecorators: { showPreviousButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPreviousButton", required: false }] }] } });
12625
12705
 
12626
12706
  class FoehnRemainingAlertsSummaryComponent {
@@ -15162,7 +15242,7 @@ class AbstractPageFromMenuComponent extends AbstractPageComponent {
15162
15242
  }
15163
15243
  breadCrumb.breadcrumbItems?.pop();
15164
15244
  this._breadcrumbEventService.setBreadcrumb(breadCrumb);
15165
- this._navigation.next();
15245
+ this.navigateToNextPage();
15166
15246
  });
15167
15247
  }
15168
15248
  appendPageToBreadCrumb() {