@dsivd/prestations-ng 18.1.2-beta.1 → 18.2.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,27 @@
6
6
 
7
7
  ---
8
8
 
9
+ ## [18.2.0] - should be aligned with prestations-be 18.2.x
10
+
11
+ ### Added
12
+
13
+ - [app-info-headers-interceptor.ts](projects/prestations-ng/src/foehn-page/foehn-app-version-mismatch/app-info-headers-interceptor.ts)
14
+
15
+ - read new header `app-version` and trigger new `foehnPageService.onAppVersionMismatch()` when application has been updated
16
+
17
+ - [foehn-app-version-mis-match-modal.component.ts](projects/prestations-ng/src/foehn-page/foehn-app-version-mismatch/foehn-app-version-mis-match-modal.component.ts)
18
+ - warn the user that the app has been updated and that the application will be reloaded
19
+ - added in `<foehn-page>`, can be deactivated with `[showAppVersionMismatchAlert]="false"`
20
+
21
+ ### Updated
22
+
23
+ - [default-dictionary.ts](projects/prestations-ng/src/sdk-dictionary/default-dictionary.ts)
24
+ - added new keys for `foehn-app-version-mis-match-modal` :
25
+ - `foehn-app-version-mismatch-modal.title` : Mise à jour détectée
26
+ - `foehn-app-version-mismatch-modal.content` : Cette application à été mise à jour. Avant de continuer votre saisie, merci de recharger la page.
27
+ - `foehn-app-version-mismatch-modal.btn.save-and-reload` : Sauver et recharger
28
+ - `foehn-app-version-mismatch-modal.btn.reload` : Recharger
29
+
9
30
  ## [18.1.1]
10
31
 
11
32
  ### Fixed
package/UPGRADING_V18.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # PRESTAKIT : Upgrading from v17 to v18
2
2
 
3
3
  To migrate your project from `prestakit` v17 to v18, you need to migrate prestations-ng and prestations-be, as usual.
4
- But to migrate to prestations-be v18, you need to migrate your project to spring boot 3 / java 21. And to be able to do
4
+ But to migrate to prestations-be v18, you need to migrate your project to spring boot 3 / java 21. And to be able to do
5
5
  that, you need to migrate your project to openshift.
6
6
 
7
7
  Let's start by migrating to openshift / spring boot 3 / prestations-be v18.
@@ -10,27 +10,27 @@ Let's start by migrating to openshift / spring boot 3 / prestations-be v18.
10
10
 
11
11
  ### Mise à jour du darch
12
12
 
13
- * Pour ce qui doit aller hors d'un namespace existant : Le GA met à jour, ou fait mettre à jour le **DARCH** (Ouvrir un Jira sur le
14
- modèle de "[ARCH-1120](https://issuetracker.etat-de-vaud.ch/outils/issuetracker/browse/ARCH-1120) - ClearPass Enroll, migration
15
- openshift - Mise à jour DARCH" pour demander un accompagnement et pour savoir qui sera le point de contact) afin de relocaliser
16
- l'applicatif dans openshift. Il met également à jour (ou s'assure que c'est fait par un architecte technique) la **matrice des flux**.
17
- (exemple de matrice, lien Fred : [ClearpassEnroll - Matrice des flux.xlsx](fred://930d2fd4-4be5-4f70-9dec-5d1e8ba13851/browse/id/workspace/SpacesStore/573a7cda-9507-46e0-9dbc-7dfdb3b4cedc))
13
+ - Pour ce qui doit aller hors d'un namespace existant : Le GA met à jour, ou fait mettre à jour le **DARCH** (Ouvrir un Jira sur le
14
+ modèle de "[ARCH-1120](https://issuetracker.etat-de-vaud.ch/outils/issuetracker/browse/ARCH-1120) - ClearPass Enroll, migration
15
+ openshift - Mise à jour DARCH" pour demander un accompagnement et pour savoir qui sera le point de contact) afin de relocaliser
16
+ l'applicatif dans openshift. Il met également à jour (ou s'assure que c'est fait par un architecte technique) la **matrice des flux**.
17
+ (exemple de matrice, lien Fred : [ClearpassEnroll - Matrice des flux.xlsx](fred://930d2fd4-4be5-4f70-9dec-5d1e8ba13851/browse/id/workspace/SpacesStore/573a7cda-9507-46e0-9dbc-7dfdb3b4cedc))
18
18
 
19
19
  ### Demande de namespace (Back-office ou pas de pool d'application existant pour l'équipe de déploiement)
20
20
 
21
- * Demander un namespace visible dans tesserakt (ex : https://portail.etat-de-vaud.ch/outils/tesserakt/namespace-groups/146420/),
22
- Easyvista → Nouveau changement → WEB → 030 - Création d'un nouvel environnement WEB (IIS, Apache, Tomcat...), pour chaque environnement
23
- * Si BO, demander à ajouter la network policy "allow-from-cybercloud" au namespace
21
+ - Demander un namespace visible dans tesserakt (ex : https://portail.etat-de-vaud.ch/outils/tesserakt/namespace-groups/146420/),
22
+ Easyvista → Nouveau changement → WEB → 030 - Création d'un nouvel environnement WEB (IIS, Apache, Tomcat...), pour chaque environnement
23
+ - Si BO, demander à ajouter la network policy "allow-from-cybercloud" au namespace
24
24
 
25
25
  ### Demande de liaison à un pool d'application
26
26
 
27
- * Si vous avez déjà un pool d'application pour votre équipe dans tesserakt (ex : cyberimtpublic/cyberimtsecurise), il suffit de faire une DC **030 - Création d'un nouvel environnement WEB** :
27
+ - Si vous avez déjà un pool d'application pour votre équipe dans tesserakt (ex : cyberimtpublic/cyberimtsecurise), il suffit de faire une DC **030 - Création d'un nouvel environnement WEB** :
28
28
 
29
- >Merci de lier la DU https://portail.etat-de-vaud.ch/outils/agref/deploy-unit/897
30
- >
31
- >au pool d'application "cyberimtpublic"
32
- >
33
- >Charts : ssh://git@bitbucket.etat-de-vaud.ch/pee/imt-charts.git / prestation
29
+ > Merci de lier la DU https://portail.etat-de-vaud.ch/outils/agref/deploy-unit/897
30
+ >
31
+ > au pool d'application "cyberimtpublic"
32
+ >
33
+ > Charts : ssh://git@bitbucket.etat-de-vaud.ch/pee/imt-charts.git / prestation
34
34
 
35
35
  ## PRESTATIONS-BE (via parent - Spring boot 3 / java 21)
36
36
 
@@ -135,8 +135,8 @@ with these properties :
135
135
 
136
136
  ### APPLICATION-PARENT
137
137
 
138
- - set parent version to `14.x.x`, check the important changes that happened since the previous version :
139
- https://dgnsiwiki.etat-de-vaud.ch/outils/dgnsiwiki/spaces/PCYBER/pages/1094779109/Correspondance+versions+prestakit+libs+cyber+changelog
138
+ - set parent version to `14.x.x`, check the important changes that happened since the previous version :
139
+ https://dgnsiwiki.etat-de-vaud.ch/outils/dgnsiwiki/spaces/PCYBER/pages/1094779109/Correspondance+versions+prestakit+libs+cyber+changelog
140
140
  - remove property `java.version` (already set to `21` in the parent)
141
141
  - if existing, remove exclusion `spring-cloud-starter-netflix-eureka-client` from `starter-prestation`
142
142
  - remove dependency `spring-boot-starter-validation` (already in `starter-prestation`)
@@ -193,18 +193,18 @@ run your application with this dependency :
193
193
  </dependency>
194
194
  ```
195
195
 
196
- look for logs that indicate property you should migrate (watch for WARN logs of class PropertiesMigrationListener), update them and remove the
196
+ look for logs that indicate property you should migrate (watch for WARN logs of class PropertiesMigrationListener), update them and remove the
197
197
  dependency
198
198
 
199
199
  ### Captcha configuration
200
200
 
201
201
  - As stated in the migration guide from v16 to v17, Cybercache is responsible for the captcha turnstile verify call.
202
202
  - Therefore, you can remove properties related to this configuration :
203
- - `recaptcha.byPassUUID`
204
- - `recaptcha.proxyUrl`
205
- - `recaptcha.proxyPort`
206
- - `recaptcha.secretkey`
207
- - `recaptcha.publickey`
203
+ - `recaptcha.byPassUUID`
204
+ - `recaptcha.proxyUrl`
205
+ - `recaptcha.proxyPort`
206
+ - `recaptcha.secretkey`
207
+ - `recaptcha.publickey`
208
208
  - If your application was not using Refinf through property `cyber-cache.configuration.enabled=false` and you still need the Recaptcha, you can replace this property with `cyber-cache.refinf-v5.enabled=false`, remove duplicated properties as before, add `cyber-cache.base-url` in your configuration and add your deployment unit in Mizo (Cybercache) for role `user`.
209
209
 
210
210
  Cookie storage is kept as before, therefore you can keep cookie related properties that starts with `recaptcha.cookie.YYY` in your properties.
@@ -274,95 +274,95 @@ Spring boot 3 doesn't support calling a controller with a trailing slash, fix th
274
274
 
275
275
  ## Openshift
276
276
 
277
- * Supprimer le fichier `assembly.xml`
278
- * Supprimer le répertoire `addons`
279
- * Supprimer le répertoire `scripts`
280
- * Supprimer le répertoire `jenkins/devex`
281
- * Supprimer l'annotation `@EnableDiscoveryClient` dans `Application.java`
282
- * Remplacer `tomcat.port=1640` par `port.http=16400` (ou adapter le port si différent) dans les fichiers `environment.
277
+ - Supprimer le fichier `assembly.xml`
278
+ - Supprimer le répertoire `addons`
279
+ - Supprimer le répertoire `scripts`
280
+ - Supprimer le répertoire `jenkins/devex`
281
+ - Supprimer l'annotation `@EnableDiscoveryClient` dans `Application.java`
282
+ - Remplacer `tomcat.port=1640` par `port.http=16400` (ou adapter le port si différent) dans les fichiers `environment.
283
283
  properties`
284
- * Remplacer `server.port=${tomcat.port}0` par `server.port=${port.http}` dans `application.properties`
285
- * Adapter `pom.xml` :
286
- * Modifier le packaging : `<packaging>jar</packaging>`
287
- * Ajouter le finalName (sous `build`) : `<finalName>${project.artifactId}</finalName>`
288
- * Ajouter les properties t6kt. 'NOM TECHNIQUE DANS AGREF' est le nom de l'application listée dans tesserakt,
289
- exemple : cyberimtpublic
290
- * `<t6kt-maven-plugin.application>NOM TECHNIQUE DANS AGREF</t6kt-maven-plugin.application>`
291
- * `<t6kt-maven-plugin.configurationVersion>master</t6kt-maven-plugin.configurationVersion>`
292
- * `<t6kt-maven-plugin.chartVersion>master</t6kt-maven-plugin.chartVersion>`
293
- * `<t6kt-maven-plugin.cluster>int01 ou extint01</t6kt-maven-plugin.cluster>`
294
- * Si parent `spring-boot-starter-parent`
295
- * Ajouter `tesserakt-maven-plugin` :
296
- * ```
297
- <!-- used by snap2t6kt (https://dsigit.etat-de-vaud.ch/outils/git/projects/DEVSUP/repos/jenkins-library/browse/vars/snap2t6kt.groovy)-->
298
- <plugin>
299
- <groupId>ch.vd.devsupport</groupId>
300
- <artifactId>tesserakt-maven-plugin</artifactId>
301
- <version>${t6kt-maven-plugin.version}</version>
302
- <configuration>
303
- <username>${T6KT_USERNAME}</username>
304
- <password>${T6KT_PASSWORD}</password>
305
- <application>${t6kt-maven-plugin.application}</application>
306
- <deployUnit>${t6kt-maven-plugin.deployUnit}</deployUnit>
307
- <applicationVersion>${t6kt-maven-plugin.applicationVersion}</applicationVersion>
308
- <chartVersion>${t6kt-maven-plugin.chartVersion}</chartVersion>
309
- <configurationVersion>${t6kt-maven-plugin.configurationVersion}</configurationVersion>
310
- <environment>${t6kt-maven-plugin.environment}</environment>
311
- <cluster>${t6kt-maven-plugin.cluster}</cluster>
312
- </configuration>
313
- </plugin>
314
- ```
315
-
284
+ - Remplacer `server.port=${tomcat.port}0` par `server.port=${port.http}` dans `application.properties`
285
+ - Adapter `pom.xml` :
286
+ - Modifier le packaging : `<packaging>jar</packaging>`
287
+ - Ajouter le finalName (sous `build`) : `<finalName>${project.artifactId}</finalName>`
288
+ - Ajouter les properties t6kt. 'NOM TECHNIQUE DANS AGREF' est le nom de l'application listée dans tesserakt,
289
+ exemple : cyberimtpublic
290
+ - `<t6kt-maven-plugin.application>NOM TECHNIQUE DANS AGREF</t6kt-maven-plugin.application>`
291
+ - `<t6kt-maven-plugin.configurationVersion>master</t6kt-maven-plugin.configurationVersion>`
292
+ - `<t6kt-maven-plugin.chartVersion>master</t6kt-maven-plugin.chartVersion>`
293
+ - `<t6kt-maven-plugin.cluster>int01 ou extint01</t6kt-maven-plugin.cluster>`
294
+ - Si parent `spring-boot-starter-parent`
295
+ - Ajouter `tesserakt-maven-plugin` :
296
+ - ```
297
+ <!-- used by snap2t6kt (https://dsigit.etat-de-vaud.ch/outils/git/projects/DEVSUP/repos/jenkins-library/browse/vars/snap2t6kt.groovy)-->
298
+ <plugin>
299
+ <groupId>ch.vd.devsupport</groupId>
300
+ <artifactId>tesserakt-maven-plugin</artifactId>
301
+ <version>${t6kt-maven-plugin.version}</version>
302
+ <configuration>
303
+ <username>${T6KT_USERNAME}</username>
304
+ <password>${T6KT_PASSWORD}</password>
305
+ <application>${t6kt-maven-plugin.application}</application>
306
+ <deployUnit>${t6kt-maven-plugin.deployUnit}</deployUnit>
307
+ <applicationVersion>${t6kt-maven-plugin.applicationVersion}</applicationVersion>
308
+ <chartVersion>${t6kt-maven-plugin.chartVersion}</chartVersion>
309
+ <configurationVersion>${t6kt-maven-plugin.configurationVersion}</configurationVersion>
310
+ <environment>${t6kt-maven-plugin.environment}</environment>
311
+ <cluster>${t6kt-maven-plugin.cluster}</cluster>
312
+ </configuration>
313
+ </plugin>
314
+ ```
316
315
 
317
316
  ### Move the configs (if it is a fo and it goes into an application pool like cyberimtpublic)
318
317
 
319
- Move the files from your configuration repository into the target repository.
318
+ Move the files from your configuration repository into the target repository.
320
319
  Example : skeleton-configuration (https://dsigit.etat-de-vaud.ch/outils/git/projects/CYBSDK/repos/skeleton-configuration/browse)
321
- into
320
+ into
322
321
  cyberimt-configuration (https://dsigit.etat-de-vaud.ch/outils/git/projects/PEE/repos/cyberimt-configuration/browse)
323
322
  and leave a README.md file in the old repository to tell where it has been moved.
324
323
 
325
- Clean the moved files by removing what is already defined in the application*.properties files.
324
+ Clean the moved files by removing what is already defined in the application\*.properties files.
326
325
 
327
- If you had folders by environment (IN / VA / PR) in your repo, move them into the vault folder of the target
326
+ If you had folders by environment (IN / VA / PR) in your repo, move them into the vault folder of the target
328
327
  repository. The subfolder name must correspond to the deployUnit name.
329
328
 
330
- Define `deployUnit.groupId` et `deployUnit.name` in your moved base properties file.
329
+ Define `deployUnit.groupId` et `deployUnit.name` in your moved base properties file.
331
330
 
332
- In the helm folder, add a subfolder with the deployUnit name and fill it with a values.yaml file (copy-paste-replace
331
+ In the helm folder, add a subfolder with the deployUnit name and fill it with a values.yaml file (copy-paste-replace
333
332
  from another similar)
334
- NB : if your application is using a `${ch.vd.dataDir}` that must survive a restart, your can mount a persistent
333
+ NB : if your application is using a `${ch.vd.dataDir}` that must survive a restart, your can mount a persistent
335
334
  volume by adding `dataDirSize: 10Mi` (pick the right size) in the values.yaml file.
336
335
 
337
336
  ### Deployment of the first snapshot in IN
338
337
 
339
- * **Equipe IMT-Portail** Ajouter le projet à jenkins
340
- * ajouter l'application à la liste :
341
- https://dsigit.etat-de-vaud.ch/outils/git/projects/PEE/repos/jenkins-libs/browse/vars/getImtPortailApplications.groovy
342
- (the name must correspond with the deployUnit name)
343
- * https://validation.portail.etat-de-vaud.ch/outils/jenkinsdgnsi/view/METIMT/job/000_Portail_SNAP_2t6kt/ => lancer un DRY_RUN
344
- * https://validation.portail.etat-de-vaud.ch/outils/jenkinsdgnsi/view/METIMT/job/000_Portail_STABLE_2t6kt/ => lancer un DRY_RUN
345
- * Supprimer l'applications des jobs "2Devex":
346
- * https://validation.portail.etat-de-vaud.ch/outils/jenkinsdgnsi/view/METIMT/job/000_Portail_SNAP_2Devex/
347
- * https://validation.portail.etat-de-vaud.ch/outils/jenkinsdgnsi/view/METIMT/job/000_Portail_STABLE_2Devex/
338
+ - **Equipe IMT-Portail** Ajouter le projet à jenkins
339
+ - ajouter l'application à la liste :
340
+ https://dsigit.etat-de-vaud.ch/outils/git/projects/PEE/repos/jenkins-libs/browse/vars/getImtPortailApplications.groovy
341
+ (the name must correspond with the deployUnit name)
342
+ - https://validation.portail.etat-de-vaud.ch/outils/jenkinsdgnsi/view/METIMT/job/000_Portail_SNAP_2t6kt/ => lancer un DRY_RUN
343
+ - https://validation.portail.etat-de-vaud.ch/outils/jenkinsdgnsi/view/METIMT/job/000_Portail_STABLE_2t6kt/ => lancer un DRY_RUN
344
+ - Supprimer l'applications des jobs "2Devex":
345
+ - https://validation.portail.etat-de-vaud.ch/outils/jenkinsdgnsi/view/METIMT/job/000_Portail_SNAP_2Devex/
346
+ - https://validation.portail.etat-de-vaud.ch/outils/jenkinsdgnsi/view/METIMT/job/000_Portail_STABLE_2Devex/
348
347
 
349
348
  Once your changes are merged, you can launch the job to deploy the first snapshot in IN using 000_Portail_SNAP_2t6kt
350
349
 
351
350
  Check the logs of the job to see if it is successful, and check the logs of your pod to see if it is running fine.
352
351
 
353
- You can now change the access configuration of your application to use the openshift route in the configuration
354
- repository (https://dsigit.etat-de-vaud.ch/outils/git/projects/CYBER/repos/configuration/browse/cyberzuul-IN.yml)
355
- for a fo. For a BO you need to make a DS to ask the WEB team to change the route. Once done and merged, restart zuul
356
- (https://portail.etat-de-vaud.ch/outils/devex/deployunit-sub/1322/containers?target=EmbeddedRHEL7) and stop your old
352
+ You can now change the access configuration of your application to use the openshift route in the configuration
353
+ repository (https://dsigit.etat-de-vaud.ch/outils/git/projects/CYBER/repos/configuration/browse/cyberzuul-IN.yml)
354
+ for a fo. For a BO you need to make a DS to ask the WEB team to change the route. Once done and merged, restart zuul
355
+ (https://portail.etat-de-vaud.ch/outils/devex/deployunit-sub/1322/containers?target=EmbeddedRHEL7) and stop your old
357
356
  application.
358
357
 
359
358
  Create a DS to desactivate the old containers in the IN vms.
360
359
 
361
- Check that your application is running fine in IN, that you can see it properly in the monitoring
362
- https://validation.portail.etat-de-vaud.ch/cyberadmin/int-consolesupport/springbootadmin/wallboard and that the
360
+ Check that your application is running fine in IN, that you can see it properly in the monitoring
361
+ https://validation.portail.etat-de-vaud.ch/cyberadmin/int-consolesupport/springbootadmin/wallboard and that the
363
362
  sensitive data are not exposed in the property configuration listing.
364
363
 
365
364
  ## PRESTATIONS-NG
365
+
366
366
  For the commands in this guide, it is supposed that your are in the `front` folder of your project.
367
367
 
368
368
  The main feature in `prestations-ng` v18 is the update of the `@angular/*` peer dependencies
@@ -680,10 +680,10 @@ npm run lint
680
680
 
681
681
  Fix manually all errors **Components, Directives and Pipes should not opt out of standalone @angular-eslint/prefer-standalone** by either:
682
682
 
683
- - Adding `// eslint-disable-next-line @angular-eslint/prefer-standalone` above `standalone: false` (recommended by
683
+ - Adding `// eslint-disable-next-line @angular-eslint/prefer-standalone` above `standalone: false` (recommended by
684
684
  IMT team, to focus on the current migration)
685
- - Transforming your component into a `standalone` component by changing `standalone: false` into `standalone: true`
686
- (recommended by angular, but implies to make a standalone migration for each component, cf
685
+ - Transforming your component into a `standalone` component by changing `standalone: false` into `standalone: true`
686
+ (recommended by angular, but implies to make a standalone migration for each component, cf
687
687
  - https://v19.angular.dev/reference/migrations/standalone, then check that your application is compiling/running well after that)
688
688
 
689
689
  Then run again:
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Optional, Inject, Injectable, EventEmitter, Input, HostBinding, Output, forwardRef, ViewChildren, ViewChild, Directive, Pipe, Component, ContentChildren, 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
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';
@@ -132,11 +132,18 @@ class FoehnPageService {
132
132
  this._foehnPageSubject = new Subject();
133
133
  this._saveFormRequestSubject = new Subject();
134
134
  this._currentEtapeId = new BehaviorSubject(null);
135
+ this._appVersionMismatch = new BehaviorSubject(false);
135
136
  this.currentEtapeIdObs = this._currentEtapeId.asObservable();
136
137
  }
137
138
  foehnPageObservable() {
138
139
  return this._foehnPageSubject.asObservable();
139
140
  }
141
+ setAppVersionMismatch() {
142
+ this._appVersionMismatch.next(true);
143
+ }
144
+ onAppVersionMismatch() {
145
+ return this._appVersionMismatch.asObservable();
146
+ }
140
147
  setPageTitle(title) {
141
148
  this._foehnPageSubject.next(title);
142
149
  }
@@ -1120,6 +1127,11 @@ const DEFAULT_DICTIONARY = {
1120
1127
  'draft-container.list.referenceInterne.label': 'Votre référence',
1121
1128
  'draft-container.list.details-in-es.label': 'Détails',
1122
1129
  'draft-container.list.details-in-es.link': "Consulter la demande {reference} dans l'espace sécurisé",
1130
+ 'foehn-app-version-mismatch-modal.title': 'Mise à jour détectée',
1131
+ 'foehn-app-version-mismatch-modal.content': '<strong>Cette application à été mise à jour.</strong><br/><br/>' +
1132
+ 'Avant de continuer votre saisie, merci de recharger la page.',
1133
+ 'foehn-app-version-mismatch-modal.btn.save-and-reload': 'Sauver et recharger',
1134
+ 'foehn-app-version-mismatch-modal.btn.reload': 'Recharger',
1123
1135
  'foehn-decision-electronique.title': 'Autorisation de notification des décisions par voie électronique',
1124
1136
  'foehn-decision-electronique.info': 'Votre demande est sur le point d’être envoyée. ' +
1125
1137
  'Conformément à l’art. 44a LPA-VD, l’autorité peut notifier ses décisions par voie électronique ' +
@@ -3762,8 +3774,7 @@ class FoehnDisplayAddressComponent {
3762
3774
  * @param address as Address
3763
3775
  * @returns any[]
3764
3776
  */
3765
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
3766
- getLines(address) {
3777
+ static getLines(address) {
3767
3778
  if (!address) {
3768
3779
  return [];
3769
3780
  }
@@ -3809,6 +3820,9 @@ class FoehnDisplayAddressComponent {
3809
3820
  }
3810
3821
  return lines;
3811
3822
  }
3823
+ getLines(address) {
3824
+ return FoehnDisplayAddressComponent.getLines(address);
3825
+ }
3812
3826
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FoehnDisplayAddressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3813
3827
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: FoehnDisplayAddressComponent, isStandalone: false, selector: "foehn-display-address", inputs: { address: "address" }, ngImport: i0, template: "<address class=\"foehn-address\" *ngIf=\"address\">\n <div *ngFor=\"let addressLine of getLines(address)\">{{ addressLine }}</div>\n</address>\n", styles: [".foehn-address{margin:0;padding:0}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
3814
3828
  }
@@ -7888,6 +7902,42 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
7888
7902
  args: [{ selector: 'foehn-transmit-waiting-modal', standalone: false, template: "<foehn-modal\n [id]=\"'foehn-transmit-waiting-modal'\"\n [modalHeaderText]=\"'foehn-transmit-waiting-modal.title' | fromDictionary\"\n modalSize=\"modal-md\"\n [isModalVisible]=\"isTransmit | async\"\n (isModalVisibleChange)=\"updateVisibilityStatus($event)\"\n [closeable]=\"false\"\n>\n <!-- Need to add a tabindex=\"0\" (here on modal-body) otherwise cdkTrapFocus will not work because no closing button -->\n <div class=\"modal-body-content\" tabindex=\"0\">\n <p\n [innerHTML]=\"\n 'foehn-transmit-waiting-modal.message' | fromDictionary\n \"\n ></p>\n <div class=\"progress\" aria-hidden=\"true\">\n <div\n role=\"progressbar\"\n class=\"progress-bar bg-success progress-bar-animated progress-bar-striped w-100\"\n ></div>\n </div>\n <small\n class=\"form-text text-secondary\"\n [innerHTML]=\"'foehn-transmit-waiting-modal.help' | fromDictionary\"\n ></small>\n </div>\n</foehn-modal>\n", styles: [":host ::ng-deep .modal{z-index:10000}:host ::ng-deep .modal-header{background-color:var(--vd-neutral-lighter)}:host ::ng-deep .modal-content{border:none}:host ::ng-deep .modal-title{margin:0!important}:host ::ng-deep .modal-body{padding:.5rem}:host ::ng-deep .modal-body-content{padding:.5rem}:host ::ng-deep .modal-footer{display:none!important}\n"] }]
7889
7903
  }], ctorParameters: () => [{ type: FoehnTransmitWaitingModalService }] });
7890
7904
 
7905
+ class FoehnAppVersionMisMatchModalComponent {
7906
+ constructor(foehnPageService) {
7907
+ this.foehnPageService = foehnPageService;
7908
+ this.hasDemandeInProgress = false;
7909
+ this.gesdemService = inject(GesdemHandlerService);
7910
+ this.registerNgModelService = inject(RegisterNgModelService);
7911
+ this.isModalVisible = this.foehnPageService.onAppVersionMismatch().pipe(filter(mismatch => !!mismatch), first(), tap$1(() => {
7912
+ this.hasDemandeInProgress =
7913
+ !!this.gesdemService.lastResponse?.meta?.reference?.length;
7914
+ }));
7915
+ }
7916
+ saveAndReload() {
7917
+ if (this.hasDemandeInProgress) {
7918
+ this.gesdemService
7919
+ .save(this.gesdemService.lastResponse.form, false, true)
7920
+ // eslint-disable-next-line rxjs-angular/prefer-async-pipe
7921
+ .subscribe(() => this.reloadPage());
7922
+ }
7923
+ else {
7924
+ this.reloadPage();
7925
+ }
7926
+ }
7927
+ reloadPage() {
7928
+ this.registerNgModelService.setHasInteractions(false);
7929
+ const url = new URL(window.location.href);
7930
+ url.searchParams.set('t', Date.now().toString());
7931
+ window.location.href = url.toString();
7932
+ }
7933
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FoehnAppVersionMisMatchModalComponent, deps: [{ token: FoehnPageService }], target: i0.ɵɵFactoryTarget.Component }); }
7934
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: FoehnAppVersionMisMatchModalComponent, isStandalone: false, selector: "foehn-app-version-mis-match-modal", ngImport: i0, template: "<foehn-modal\n [id]=\"'foehn-app-version-mismatch-modal'\"\n [modalHeaderText]=\"\n 'foehn-app-version-mismatch-modal.title' | fromDictionary\n \"\n modalSize=\"modal-md\"\n [isModalVisible]=\"isModalVisible | async\"\n [closeable]=\"false\"\n>\n <div\n id=\"foehn-app-version-mismatch-modal-body\"\n [innerHTML]=\"\n 'foehn-app-version-mismatch-modal.content' | fromDictionary\n \"\n ></div>\n\n <div modal-footer class=\"w-100\">\n <div class=\"d-flex\">\n <button\n id=\"saveAndReloadBtn\"\n type=\"button\"\n class=\"btn btn-primary ms-auto\"\n [innerHTML]=\"\n (hasDemandeInProgress\n ? 'foehn-app-version-mismatch-modal.btn.save-and-reload'\n : 'foehn-app-version-mismatch-modal.btn.reload'\n ) | fromDictionary\n \"\n (click)=\"saveAndReload()\"\n ></button>\n </div>\n </div>\n</foehn-modal>\n", styles: [":host ::ng-deep .modal{z-index:10000}\n"], dependencies: [{ kind: "component", type: FoehnModalComponent, selector: "foehn-modal", inputs: ["id", "name", "modalSize", "modalBodyText", "modalHeaderText", "closeable", "draggable", "hideable", "modalTriggerHtmlElement", "isModalVisible"], outputs: ["isModalVisibleChange"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: SdkDictionaryPipe, name: "fromDictionary" }] }); }
7935
+ }
7936
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FoehnAppVersionMisMatchModalComponent, decorators: [{
7937
+ type: Component,
7938
+ args: [{ selector: 'foehn-app-version-mis-match-modal', standalone: false, template: "<foehn-modal\n [id]=\"'foehn-app-version-mismatch-modal'\"\n [modalHeaderText]=\"\n 'foehn-app-version-mismatch-modal.title' | fromDictionary\n \"\n modalSize=\"modal-md\"\n [isModalVisible]=\"isModalVisible | async\"\n [closeable]=\"false\"\n>\n <div\n id=\"foehn-app-version-mismatch-modal-body\"\n [innerHTML]=\"\n 'foehn-app-version-mismatch-modal.content' | fromDictionary\n \"\n ></div>\n\n <div modal-footer class=\"w-100\">\n <div class=\"d-flex\">\n <button\n id=\"saveAndReloadBtn\"\n type=\"button\"\n class=\"btn btn-primary ms-auto\"\n [innerHTML]=\"\n (hasDemandeInProgress\n ? 'foehn-app-version-mismatch-modal.btn.save-and-reload'\n : 'foehn-app-version-mismatch-modal.btn.reload'\n ) | fromDictionary\n \"\n (click)=\"saveAndReload()\"\n ></button>\n </div>\n </div>\n</foehn-modal>\n", styles: [":host ::ng-deep .modal{z-index:10000}\n"] }]
7939
+ }], ctorParameters: () => [{ type: FoehnPageService }] });
7940
+
7891
7941
  const LEAVING_ALERT_CONTENT = 'Ce changement de page entraine une perte des données non sauvegardées.<br/>Souhaitez-vous quand même continuer ?';
7892
7942
  const LEAVING_ALERT_OK = 'Poursuivre sans sauvegarder';
7893
7943
  const LEAVING_ALERT_CANCEL = 'Retourner à la prestation';
@@ -7939,6 +7989,7 @@ class FoehnPageComponent {
7939
7989
  * reloading the page while having unsaved data.
7940
7990
  */
7941
7991
  this.showBeforeUnloadNativeConfirmAlert = true;
7992
+ this.showAppVersionMismatchAlert = true;
7942
7993
  this.loginMessagesHidden = false;
7943
7994
  this.browserLinkTitlePrefix = 'Lien pour le téléchargement du navigateur internet';
7944
7995
  this.browserNotSupportedBypass = false;
@@ -8062,11 +8113,11 @@ class FoehnPageComponent {
8062
8113
  this.pageTitle = title;
8063
8114
  }
8064
8115
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FoehnPageComponent, deps: [{ token: i1$3.Title }, { token: FoehnPageService }, { token: SupportAlertService }, { token: FoehnNavigationService }, { token: ApplicationInfoService }, { token: GesdemEventService }, { token: BreadcrumbEventService }, { token: i1$1.Router }, { token: SessionInfo }, { token: FoehnPageModalService }, { token: SdkDictionaryService }, { token: SdkStatisticsService }, { token: DemandeExpirationService }, { token: RegisterNgModelService }], target: i0.ɵɵFactoryTarget.Component }); }
8065
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: FoehnPageComponent, isStandalone: false, selector: "foehn-page", inputs: { appTitle: "appTitle", footerLinks: "footerLinks", supportAlertEnabled: "supportAlertEnabled", draftsEnabled: "draftsEnabled", supportAlertUrl: "supportAlertUrl", draftsUrl: "draftsUrl", etapeId: "etapeId", userConnectedAsDisplayed: "userConnectedAsDisplayed", statusProgressBarHidden: "statusProgressBarHidden", confirmLeavingAlert: "confirmLeavingAlert", showDefaultContactFooterLink: "showDefaultContactFooterLink", showDefaultGuideFooterLink: "showDefaultGuideFooterLink", showDefaultTermOfUseLink: "showDefaultTermOfUseLink", showDefaultSecurityBestPracticeLink: "showDefaultSecurityBestPracticeLink", showBeforeUnloadNativeConfirmAlert: "showBeforeUnloadNativeConfirmAlert", routerLinkAppTitle: "routerLinkAppTitle" }, host: { listeners: { "window:beforeunload": "unloadNotification($event)" } }, usesOnChanges: true, ngImport: i0, template: "<foehn-page-expiration-timer\n *ngIf=\"(displayDemandeExpirationTimer | async) === true\"\n id=\"foehn-page-expiration-timer\"\n></foehn-page-expiration-timer>\n<foehn-header\n id=\"foehn_header\"\n [title]=\"appTitle\"\n [routerLinkAppTitle]=\"routerLinkAppTitle\"\n [showSecuredAreaLoginButton]=\"showSecuredAreaLoginButton | async\"\n></foehn-header>\n<foehn-growl id=\"foehn_growl\"></foehn-growl>\n<div class=\"vd-bg-pattern-gray\">\n <div class=\"container\">\n <foehn-breadcrumb\n [confirmLeavingAlert]=\"confirmLeavingAlert\"\n ></foehn-breadcrumb>\n </div>\n</div>\n<main id=\"main\">\n <div class=\"vd-bg-pattern-gray\">\n <div class=\"container\">\n <!-- Fix annoying flickering when the page loads -->\n <div class=\"h1 mt-0\" *ngIf=\"!pageTitle\">&nbsp;</div>\n <h1\n [tabIndex]=\"-1\"\n class=\"mt-0\"\n id=\"page-title\"\n *ngIf=\"!!pageTitle\"\n [innerHTML]=\"pageTitle\"\n ></h1>\n </div>\n </div>\n\n <foehn-status-progress-bar\n [hidden]=\"\n statusProgressBarHidden || !!(hasBlockingSupportAlert | async)\n \"\n ></foehn-status-progress-bar>\n\n <section\n *ngIf=\"!isBrowserSupported\"\n class=\"container alert alert-danger\"\n id=\"browser_not_supported_block\"\n role=\"alert\"\n >\n <p class=\"alert-heading\">\n <strong>\n {{ 'foehn-page.browser-not-supported' | fromDictionary }}\n </strong>\n </p>\n <p class=\"mb-0\">\n {{ 'foehn-page.browser-download-invitation' | fromDictionary }}\n <ng-container *ngIf=\"!isApplePlatform\">\n <a\n [title]=\"browserLinkTitlePrefix + ' Edge'\"\n href=\"https://www.microsoft.com/fr-ch/windows/microsoft-edge\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Edge\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n ,\n </ng-container>\n <ng-container *ngIf=\"isApplePlatform\">\n <a\n [title]=\"browserLinkTitlePrefix + ' Safari'\"\n href=\"https://support.apple.com/downloads/safari\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Safari\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n ,\n </ng-container>\n <a\n [title]=\"browserLinkTitlePrefix + ' Firefox'\"\n href=\"https://www.mozilla.org/fr/firefox/\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Firefox\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n {{ 'foehn-page.browser-download-list.ou' | fromDictionary }}\n <a\n [title]=\"browserLinkTitlePrefix + ' Chrome'\"\n href=\"https://www.google.com/intl/fr/chrome/\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Chrome\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n .\n </p>\n <div class=\"row mt-3\">\n <div class=\"col-md-12\">\n <button\n id=\"browser_not_supported_bypass\"\n type=\"button\"\n class=\"float-end btn btn-danger\"\n *ngIf=\"!browserNotSupportedBypass\"\n (click)=\"browserNotSupportedBypass = true\"\n >\n {{\n 'foehn-page.continue-with-same-browser' | fromDictionary\n }}\n </button>\n </div>\n </div>\n </section>\n\n <sdk-support-alert-container\n *ngIf=\"supportAlertEnabled\"\n [etapeId]=\"etapeId\"\n [supportAlertUrl]=\"supportAlertUrl\"\n ></sdk-support-alert-container>\n <sdk-drafts-container\n *ngIf=\"draftsEnabled\"\n [etapeId]=\"etapeId\"\n [draftsUrl]=\"draftsUrl\"\n ></sdk-drafts-container>\n <ng-container\n *ngIf=\"\n !(hasBlockingSupportAlert | async) &&\n (isBrowserSupported || browserNotSupportedBypass)\n \"\n >\n <div class=\"container mt-5\" id=\"page_content\">\n <foehn-user-connected-as\n *ngIf=\"displayUserCategory | async\"\n ></foehn-user-connected-as>\n </div>\n <ng-content></ng-content>\n </ng-container>\n</main>\n<foehn-footer\n id=\"foehn_footer\"\n [links]=\"footerLinks\"\n [showDefaultContactLink]=\"showDefaultContactFooterLink\"\n [showDefaultGuideLink]=\"showDefaultGuideFooterLink\"\n [showDefaultTermOfUseLink]=\"showDefaultTermOfUseLink\"\n [showDefaultSecurityBestPracticeLink]=\"showDefaultSecurityBestPracticeLink\"\n></foehn-footer>\n<foehn-page-modal></foehn-page-modal>\n<foehn-confirm-modal></foehn-confirm-modal>\n<foehn-transmit-waiting-modal></foehn-transmit-waiting-modal>\n", styles: ["#loginAndContinueButton{text-decoration:underline}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DraftsContainerComponent, selector: "sdk-drafts-container", inputs: ["etapeId", "draftsUrl"] }, { kind: "component", type: FoehnBreadcrumbComponent, selector: "foehn-breadcrumb", inputs: ["breadcrumbItems", "currentNav", "confirmLeavingAlert"] }, { kind: "component", type: FoehnGrowlComponent, selector: "foehn-growl" }, { kind: "component", type: FoehnHeaderComponent, selector: "foehn-header", inputs: ["title", "showSecuredAreaLoginButton", "routerLinkAppTitle", "userInfo"] }, { kind: "component", type: FoehnFooterComponent, selector: "foehn-footer", inputs: ["links", "showDefaultContactLink", "showDefaultGuideLink", "showDefaultTermOfUseLink", "showDefaultSecurityBestPracticeLink"] }, { kind: "component", type: FoehnUserConnectedAsComponent, selector: "foehn-user-connected-as" }, { kind: "component", type: SupportAlertContainerComponent, selector: "sdk-support-alert-container", inputs: ["etapeId", "supportAlertUrl"] }, { kind: "component", type: FoehnConfirmModalComponent, selector: "foehn-confirm-modal" }, { kind: "component", type: FoehnIconExternalLinkAltComponent, selector: "foehn-icon-external-link-alt" }, { kind: "component", type: FoehnStatusProgressBarComponent, selector: "foehn-status-progress-bar", inputs: ["hidden"] }, { kind: "component", type: FoehnPageModalComponent, selector: "foehn-page-modal" }, { kind: "component", type: FoehnPageExpirationTimerComponent, selector: "foehn-page-expiration-timer" }, { kind: "component", type: FoehnTransmitWaitingModalComponent, selector: "foehn-transmit-waiting-modal" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: SdkDictionaryPipe, name: "fromDictionary" }] }); }
8116
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: FoehnPageComponent, isStandalone: false, selector: "foehn-page", inputs: { appTitle: "appTitle", footerLinks: "footerLinks", supportAlertEnabled: "supportAlertEnabled", draftsEnabled: "draftsEnabled", supportAlertUrl: "supportAlertUrl", draftsUrl: "draftsUrl", etapeId: "etapeId", userConnectedAsDisplayed: "userConnectedAsDisplayed", statusProgressBarHidden: "statusProgressBarHidden", confirmLeavingAlert: "confirmLeavingAlert", showDefaultContactFooterLink: "showDefaultContactFooterLink", showDefaultGuideFooterLink: "showDefaultGuideFooterLink", showDefaultTermOfUseLink: "showDefaultTermOfUseLink", showDefaultSecurityBestPracticeLink: "showDefaultSecurityBestPracticeLink", showBeforeUnloadNativeConfirmAlert: "showBeforeUnloadNativeConfirmAlert", showAppVersionMismatchAlert: "showAppVersionMismatchAlert", routerLinkAppTitle: "routerLinkAppTitle" }, host: { listeners: { "window:beforeunload": "unloadNotification($event)" } }, usesOnChanges: true, ngImport: i0, template: "<foehn-page-expiration-timer\n *ngIf=\"(displayDemandeExpirationTimer | async) === true\"\n id=\"foehn-page-expiration-timer\"\n></foehn-page-expiration-timer>\n<foehn-header\n id=\"foehn_header\"\n [title]=\"appTitle\"\n [routerLinkAppTitle]=\"routerLinkAppTitle\"\n [showSecuredAreaLoginButton]=\"showSecuredAreaLoginButton | async\"\n></foehn-header>\n<foehn-growl id=\"foehn_growl\"></foehn-growl>\n<div class=\"vd-bg-pattern-gray\">\n <div class=\"container\">\n <foehn-breadcrumb\n [confirmLeavingAlert]=\"confirmLeavingAlert\"\n ></foehn-breadcrumb>\n </div>\n</div>\n<main id=\"main\">\n <div class=\"vd-bg-pattern-gray\">\n <div class=\"container\">\n <!-- Fix annoying flickering when the page loads -->\n <div class=\"h1 mt-0\" *ngIf=\"!pageTitle\">&nbsp;</div>\n <h1\n [tabIndex]=\"-1\"\n class=\"mt-0\"\n id=\"page-title\"\n *ngIf=\"!!pageTitle\"\n [innerHTML]=\"pageTitle\"\n ></h1>\n </div>\n </div>\n\n <foehn-status-progress-bar\n [hidden]=\"\n statusProgressBarHidden || !!(hasBlockingSupportAlert | async)\n \"\n ></foehn-status-progress-bar>\n\n <section\n *ngIf=\"!isBrowserSupported\"\n class=\"container alert alert-danger\"\n id=\"browser_not_supported_block\"\n role=\"alert\"\n >\n <p class=\"alert-heading\">\n <strong>\n {{ 'foehn-page.browser-not-supported' | fromDictionary }}\n </strong>\n </p>\n <p class=\"mb-0\">\n {{ 'foehn-page.browser-download-invitation' | fromDictionary }}\n <ng-container *ngIf=\"!isApplePlatform\">\n <a\n [title]=\"browserLinkTitlePrefix + ' Edge'\"\n href=\"https://www.microsoft.com/fr-ch/windows/microsoft-edge\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Edge\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n ,\n </ng-container>\n <ng-container *ngIf=\"isApplePlatform\">\n <a\n [title]=\"browserLinkTitlePrefix + ' Safari'\"\n href=\"https://support.apple.com/downloads/safari\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Safari\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n ,\n </ng-container>\n <a\n [title]=\"browserLinkTitlePrefix + ' Firefox'\"\n href=\"https://www.mozilla.org/fr/firefox/\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Firefox\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n {{ 'foehn-page.browser-download-list.ou' | fromDictionary }}\n <a\n [title]=\"browserLinkTitlePrefix + ' Chrome'\"\n href=\"https://www.google.com/intl/fr/chrome/\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Chrome\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n .\n </p>\n <div class=\"row mt-3\">\n <div class=\"col-md-12\">\n <button\n id=\"browser_not_supported_bypass\"\n type=\"button\"\n class=\"float-end btn btn-danger\"\n *ngIf=\"!browserNotSupportedBypass\"\n (click)=\"browserNotSupportedBypass = true\"\n >\n {{\n 'foehn-page.continue-with-same-browser' | fromDictionary\n }}\n </button>\n </div>\n </div>\n </section>\n\n <sdk-support-alert-container\n *ngIf=\"supportAlertEnabled\"\n [etapeId]=\"etapeId\"\n [supportAlertUrl]=\"supportAlertUrl\"\n ></sdk-support-alert-container>\n <sdk-drafts-container\n *ngIf=\"draftsEnabled\"\n [etapeId]=\"etapeId\"\n [draftsUrl]=\"draftsUrl\"\n ></sdk-drafts-container>\n <ng-container\n *ngIf=\"\n !(hasBlockingSupportAlert | async) &&\n (isBrowserSupported || browserNotSupportedBypass)\n \"\n >\n <div class=\"container mt-5\" id=\"page_content\">\n <foehn-user-connected-as\n *ngIf=\"displayUserCategory | async\"\n ></foehn-user-connected-as>\n </div>\n <ng-content></ng-content>\n </ng-container>\n</main>\n<foehn-footer\n id=\"foehn_footer\"\n [links]=\"footerLinks\"\n [showDefaultContactLink]=\"showDefaultContactFooterLink\"\n [showDefaultGuideLink]=\"showDefaultGuideFooterLink\"\n [showDefaultTermOfUseLink]=\"showDefaultTermOfUseLink\"\n [showDefaultSecurityBestPracticeLink]=\"showDefaultSecurityBestPracticeLink\"\n></foehn-footer>\n<foehn-page-modal></foehn-page-modal>\n<foehn-confirm-modal></foehn-confirm-modal>\n<foehn-transmit-waiting-modal></foehn-transmit-waiting-modal>\n@if (showAppVersionMismatchAlert) {\n <foehn-app-version-mis-match-modal></foehn-app-version-mis-match-modal>\n}\n", styles: ["#loginAndContinueButton{text-decoration:underline}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: DraftsContainerComponent, selector: "sdk-drafts-container", inputs: ["etapeId", "draftsUrl"] }, { kind: "component", type: FoehnBreadcrumbComponent, selector: "foehn-breadcrumb", inputs: ["breadcrumbItems", "currentNav", "confirmLeavingAlert"] }, { kind: "component", type: FoehnGrowlComponent, selector: "foehn-growl" }, { kind: "component", type: FoehnHeaderComponent, selector: "foehn-header", inputs: ["title", "showSecuredAreaLoginButton", "routerLinkAppTitle", "userInfo"] }, { kind: "component", type: FoehnFooterComponent, selector: "foehn-footer", inputs: ["links", "showDefaultContactLink", "showDefaultGuideLink", "showDefaultTermOfUseLink", "showDefaultSecurityBestPracticeLink"] }, { kind: "component", type: FoehnUserConnectedAsComponent, selector: "foehn-user-connected-as" }, { kind: "component", type: SupportAlertContainerComponent, selector: "sdk-support-alert-container", inputs: ["etapeId", "supportAlertUrl"] }, { kind: "component", type: FoehnConfirmModalComponent, selector: "foehn-confirm-modal" }, { kind: "component", type: FoehnIconExternalLinkAltComponent, selector: "foehn-icon-external-link-alt" }, { kind: "component", type: FoehnStatusProgressBarComponent, selector: "foehn-status-progress-bar", inputs: ["hidden"] }, { kind: "component", type: FoehnPageModalComponent, selector: "foehn-page-modal" }, { kind: "component", type: FoehnPageExpirationTimerComponent, selector: "foehn-page-expiration-timer" }, { kind: "component", type: FoehnTransmitWaitingModalComponent, selector: "foehn-transmit-waiting-modal" }, { kind: "component", type: FoehnAppVersionMisMatchModalComponent, selector: "foehn-app-version-mis-match-modal" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: SdkDictionaryPipe, name: "fromDictionary" }] }); }
8066
8117
  }
8067
8118
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FoehnPageComponent, decorators: [{
8068
8119
  type: Component,
8069
- args: [{ selector: 'foehn-page', standalone: false, template: "<foehn-page-expiration-timer\n *ngIf=\"(displayDemandeExpirationTimer | async) === true\"\n id=\"foehn-page-expiration-timer\"\n></foehn-page-expiration-timer>\n<foehn-header\n id=\"foehn_header\"\n [title]=\"appTitle\"\n [routerLinkAppTitle]=\"routerLinkAppTitle\"\n [showSecuredAreaLoginButton]=\"showSecuredAreaLoginButton | async\"\n></foehn-header>\n<foehn-growl id=\"foehn_growl\"></foehn-growl>\n<div class=\"vd-bg-pattern-gray\">\n <div class=\"container\">\n <foehn-breadcrumb\n [confirmLeavingAlert]=\"confirmLeavingAlert\"\n ></foehn-breadcrumb>\n </div>\n</div>\n<main id=\"main\">\n <div class=\"vd-bg-pattern-gray\">\n <div class=\"container\">\n <!-- Fix annoying flickering when the page loads -->\n <div class=\"h1 mt-0\" *ngIf=\"!pageTitle\">&nbsp;</div>\n <h1\n [tabIndex]=\"-1\"\n class=\"mt-0\"\n id=\"page-title\"\n *ngIf=\"!!pageTitle\"\n [innerHTML]=\"pageTitle\"\n ></h1>\n </div>\n </div>\n\n <foehn-status-progress-bar\n [hidden]=\"\n statusProgressBarHidden || !!(hasBlockingSupportAlert | async)\n \"\n ></foehn-status-progress-bar>\n\n <section\n *ngIf=\"!isBrowserSupported\"\n class=\"container alert alert-danger\"\n id=\"browser_not_supported_block\"\n role=\"alert\"\n >\n <p class=\"alert-heading\">\n <strong>\n {{ 'foehn-page.browser-not-supported' | fromDictionary }}\n </strong>\n </p>\n <p class=\"mb-0\">\n {{ 'foehn-page.browser-download-invitation' | fromDictionary }}\n <ng-container *ngIf=\"!isApplePlatform\">\n <a\n [title]=\"browserLinkTitlePrefix + ' Edge'\"\n href=\"https://www.microsoft.com/fr-ch/windows/microsoft-edge\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Edge\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n ,\n </ng-container>\n <ng-container *ngIf=\"isApplePlatform\">\n <a\n [title]=\"browserLinkTitlePrefix + ' Safari'\"\n href=\"https://support.apple.com/downloads/safari\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Safari\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n ,\n </ng-container>\n <a\n [title]=\"browserLinkTitlePrefix + ' Firefox'\"\n href=\"https://www.mozilla.org/fr/firefox/\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Firefox\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n {{ 'foehn-page.browser-download-list.ou' | fromDictionary }}\n <a\n [title]=\"browserLinkTitlePrefix + ' Chrome'\"\n href=\"https://www.google.com/intl/fr/chrome/\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Chrome\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n .\n </p>\n <div class=\"row mt-3\">\n <div class=\"col-md-12\">\n <button\n id=\"browser_not_supported_bypass\"\n type=\"button\"\n class=\"float-end btn btn-danger\"\n *ngIf=\"!browserNotSupportedBypass\"\n (click)=\"browserNotSupportedBypass = true\"\n >\n {{\n 'foehn-page.continue-with-same-browser' | fromDictionary\n }}\n </button>\n </div>\n </div>\n </section>\n\n <sdk-support-alert-container\n *ngIf=\"supportAlertEnabled\"\n [etapeId]=\"etapeId\"\n [supportAlertUrl]=\"supportAlertUrl\"\n ></sdk-support-alert-container>\n <sdk-drafts-container\n *ngIf=\"draftsEnabled\"\n [etapeId]=\"etapeId\"\n [draftsUrl]=\"draftsUrl\"\n ></sdk-drafts-container>\n <ng-container\n *ngIf=\"\n !(hasBlockingSupportAlert | async) &&\n (isBrowserSupported || browserNotSupportedBypass)\n \"\n >\n <div class=\"container mt-5\" id=\"page_content\">\n <foehn-user-connected-as\n *ngIf=\"displayUserCategory | async\"\n ></foehn-user-connected-as>\n </div>\n <ng-content></ng-content>\n </ng-container>\n</main>\n<foehn-footer\n id=\"foehn_footer\"\n [links]=\"footerLinks\"\n [showDefaultContactLink]=\"showDefaultContactFooterLink\"\n [showDefaultGuideLink]=\"showDefaultGuideFooterLink\"\n [showDefaultTermOfUseLink]=\"showDefaultTermOfUseLink\"\n [showDefaultSecurityBestPracticeLink]=\"showDefaultSecurityBestPracticeLink\"\n></foehn-footer>\n<foehn-page-modal></foehn-page-modal>\n<foehn-confirm-modal></foehn-confirm-modal>\n<foehn-transmit-waiting-modal></foehn-transmit-waiting-modal>\n", styles: ["#loginAndContinueButton{text-decoration:underline}\n"] }]
8120
+ args: [{ selector: 'foehn-page', standalone: false, template: "<foehn-page-expiration-timer\n *ngIf=\"(displayDemandeExpirationTimer | async) === true\"\n id=\"foehn-page-expiration-timer\"\n></foehn-page-expiration-timer>\n<foehn-header\n id=\"foehn_header\"\n [title]=\"appTitle\"\n [routerLinkAppTitle]=\"routerLinkAppTitle\"\n [showSecuredAreaLoginButton]=\"showSecuredAreaLoginButton | async\"\n></foehn-header>\n<foehn-growl id=\"foehn_growl\"></foehn-growl>\n<div class=\"vd-bg-pattern-gray\">\n <div class=\"container\">\n <foehn-breadcrumb\n [confirmLeavingAlert]=\"confirmLeavingAlert\"\n ></foehn-breadcrumb>\n </div>\n</div>\n<main id=\"main\">\n <div class=\"vd-bg-pattern-gray\">\n <div class=\"container\">\n <!-- Fix annoying flickering when the page loads -->\n <div class=\"h1 mt-0\" *ngIf=\"!pageTitle\">&nbsp;</div>\n <h1\n [tabIndex]=\"-1\"\n class=\"mt-0\"\n id=\"page-title\"\n *ngIf=\"!!pageTitle\"\n [innerHTML]=\"pageTitle\"\n ></h1>\n </div>\n </div>\n\n <foehn-status-progress-bar\n [hidden]=\"\n statusProgressBarHidden || !!(hasBlockingSupportAlert | async)\n \"\n ></foehn-status-progress-bar>\n\n <section\n *ngIf=\"!isBrowserSupported\"\n class=\"container alert alert-danger\"\n id=\"browser_not_supported_block\"\n role=\"alert\"\n >\n <p class=\"alert-heading\">\n <strong>\n {{ 'foehn-page.browser-not-supported' | fromDictionary }}\n </strong>\n </p>\n <p class=\"mb-0\">\n {{ 'foehn-page.browser-download-invitation' | fromDictionary }}\n <ng-container *ngIf=\"!isApplePlatform\">\n <a\n [title]=\"browserLinkTitlePrefix + ' Edge'\"\n href=\"https://www.microsoft.com/fr-ch/windows/microsoft-edge\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Edge\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n ,\n </ng-container>\n <ng-container *ngIf=\"isApplePlatform\">\n <a\n [title]=\"browserLinkTitlePrefix + ' Safari'\"\n href=\"https://support.apple.com/downloads/safari\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Safari\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n ,\n </ng-container>\n <a\n [title]=\"browserLinkTitlePrefix + ' Firefox'\"\n href=\"https://www.mozilla.org/fr/firefox/\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Firefox\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n {{ 'foehn-page.browser-download-list.ou' | fromDictionary }}\n <a\n [title]=\"browserLinkTitlePrefix + ' Chrome'\"\n href=\"https://www.google.com/intl/fr/chrome/\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n Chrome\n <span class=\"visually-hidden\">\n {{ 'foehn-page.external-link.srOnly' | fromDictionary }}\n </span>\n <span aria-hidden=\"true\">\n <foehn-icon-external-link-alt></foehn-icon-external-link-alt>\n </span>\n </a>\n .\n </p>\n <div class=\"row mt-3\">\n <div class=\"col-md-12\">\n <button\n id=\"browser_not_supported_bypass\"\n type=\"button\"\n class=\"float-end btn btn-danger\"\n *ngIf=\"!browserNotSupportedBypass\"\n (click)=\"browserNotSupportedBypass = true\"\n >\n {{\n 'foehn-page.continue-with-same-browser' | fromDictionary\n }}\n </button>\n </div>\n </div>\n </section>\n\n <sdk-support-alert-container\n *ngIf=\"supportAlertEnabled\"\n [etapeId]=\"etapeId\"\n [supportAlertUrl]=\"supportAlertUrl\"\n ></sdk-support-alert-container>\n <sdk-drafts-container\n *ngIf=\"draftsEnabled\"\n [etapeId]=\"etapeId\"\n [draftsUrl]=\"draftsUrl\"\n ></sdk-drafts-container>\n <ng-container\n *ngIf=\"\n !(hasBlockingSupportAlert | async) &&\n (isBrowserSupported || browserNotSupportedBypass)\n \"\n >\n <div class=\"container mt-5\" id=\"page_content\">\n <foehn-user-connected-as\n *ngIf=\"displayUserCategory | async\"\n ></foehn-user-connected-as>\n </div>\n <ng-content></ng-content>\n </ng-container>\n</main>\n<foehn-footer\n id=\"foehn_footer\"\n [links]=\"footerLinks\"\n [showDefaultContactLink]=\"showDefaultContactFooterLink\"\n [showDefaultGuideLink]=\"showDefaultGuideFooterLink\"\n [showDefaultTermOfUseLink]=\"showDefaultTermOfUseLink\"\n [showDefaultSecurityBestPracticeLink]=\"showDefaultSecurityBestPracticeLink\"\n></foehn-footer>\n<foehn-page-modal></foehn-page-modal>\n<foehn-confirm-modal></foehn-confirm-modal>\n<foehn-transmit-waiting-modal></foehn-transmit-waiting-modal>\n@if (showAppVersionMismatchAlert) {\n <foehn-app-version-mis-match-modal></foehn-app-version-mis-match-modal>\n}\n", styles: ["#loginAndContinueButton{text-decoration:underline}\n"] }]
8070
8121
  }], ctorParameters: () => [{ type: i1$3.Title }, { type: FoehnPageService }, { type: SupportAlertService }, { type: FoehnNavigationService }, { type: ApplicationInfoService }, { type: GesdemEventService }, { type: BreadcrumbEventService }, { type: i1$1.Router }, { type: SessionInfo }, { type: FoehnPageModalService }, { type: SdkDictionaryService }, { type: SdkStatisticsService }, { type: DemandeExpirationService }, { type: RegisterNgModelService }], propDecorators: { appTitle: [{
8071
8122
  type: Input
8072
8123
  }], footerLinks: [{
@@ -8097,6 +8148,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
8097
8148
  type: Input
8098
8149
  }], showBeforeUnloadNativeConfirmAlert: [{
8099
8150
  type: Input
8151
+ }], showAppVersionMismatchAlert: [{
8152
+ type: Input
8100
8153
  }], routerLinkAppTitle: [{
8101
8154
  type: Input
8102
8155
  }], unloadNotification: [{
@@ -9652,6 +9705,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
9652
9705
  }]
9653
9706
  }] });
9654
9707
 
9708
+ const APP_VERSION_HEADER = 'app-version';
9709
+ class AppInfoHeadersInterceptor {
9710
+ constructor() {
9711
+ this.foehnPageService = inject(FoehnPageService);
9712
+ }
9713
+ intercept(request, next) {
9714
+ return next.handle(request).pipe(tap$1((httpEvent) => {
9715
+ if (httpEvent instanceof HttpResponse) {
9716
+ const appVersionInHeader = httpEvent.headers.get(APP_VERSION_HEADER);
9717
+ if (!this.appVersion?.length) {
9718
+ this.appVersion = appVersionInHeader;
9719
+ }
9720
+ else {
9721
+ if (appVersionInHeader &&
9722
+ this.appVersion !== appVersionInHeader) {
9723
+ this.foehnPageService.setAppVersionMismatch();
9724
+ }
9725
+ }
9726
+ }
9727
+ }));
9728
+ }
9729
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AppInfoHeadersInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9730
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AppInfoHeadersInterceptor, providedIn: 'root' }); }
9731
+ }
9732
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AppInfoHeadersInterceptor, decorators: [{
9733
+ type: Injectable,
9734
+ args: [{
9735
+ providedIn: 'root'
9736
+ }]
9737
+ }] });
9738
+ const APP_INFO_HEADERS_INTERCEPTOR_PROVIDER = [
9739
+ {
9740
+ provide: HTTP_INTERCEPTORS,
9741
+ useExisting: AppInfoHeadersInterceptor,
9742
+ multi: true
9743
+ }
9744
+ ];
9745
+
9655
9746
  class FoehnPageCounterComponent {
9656
9747
  constructor(foehnNavigationService, ngZone) {
9657
9748
  this.foehnNavigationService = foehnNavigationService;
@@ -9747,7 +9838,8 @@ class FoehnPageModule {
9747
9838
  FoehnPageCounterComponent,
9748
9839
  FoehnPageModalComponent,
9749
9840
  FoehnPageExpirationTimerComponent,
9750
- FoehnTransmitWaitingModalComponent], imports: [CommonModule,
9841
+ FoehnTransmitWaitingModalComponent,
9842
+ FoehnAppVersionMisMatchModalComponent], imports: [CommonModule,
9751
9843
  DraftsModule,
9752
9844
  FoehnBreadcrumbModule,
9753
9845
  FoehnGrowlModule,
@@ -9765,6 +9857,7 @@ class FoehnPageModule {
9765
9857
  FoehnPageExpirationTimerComponent,
9766
9858
  FoehnTransmitWaitingModalComponent] }); }
9767
9859
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FoehnPageModule, providers: [
9860
+ APP_INFO_HEADERS_INTERCEPTOR_PROVIDER,
9768
9861
  DEMANDE_EXPIRATION_INTERCEPTOR_PROVIDER,
9769
9862
  DEMANDE_TRANSMIT_INTERCEPTOR_PROVIDER
9770
9863
  ], imports: [CommonModule,
@@ -9804,7 +9897,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
9804
9897
  FoehnPageCounterComponent,
9805
9898
  FoehnPageModalComponent,
9806
9899
  FoehnPageExpirationTimerComponent,
9807
- FoehnTransmitWaitingModalComponent
9900
+ FoehnTransmitWaitingModalComponent,
9901
+ FoehnAppVersionMisMatchModalComponent
9808
9902
  ],
9809
9903
  exports: [
9810
9904
  FoehnPageComponent,
@@ -9814,6 +9908,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
9814
9908
  FoehnTransmitWaitingModalComponent
9815
9909
  ],
9816
9910
  providers: [
9911
+ APP_INFO_HEADERS_INTERCEPTOR_PROVIDER,
9817
9912
  DEMANDE_EXPIRATION_INTERCEPTOR_PROVIDER,
9818
9913
  DEMANDE_TRANSMIT_INTERCEPTOR_PROVIDER
9819
9914
  ]