@dsivd/prestations-ng 16.4.0-beta.8 → 16.4.0

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.
Files changed (31) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/UPGRADING_V16.md +33 -14
  3. package/dsivd-prestations-ng-v16.4.0.tgz +0 -0
  4. package/esm2020/foehn-input/pattern.const.mjs +2 -2
  5. package/esm2020/foehn-page/foehn-page-expiration-timer/demande-expiration-interceptor.mjs +62 -0
  6. package/esm2020/foehn-page/foehn-page-expiration-timer/demande-expiration.service.mjs +46 -0
  7. package/esm2020/foehn-page/foehn-page-expiration-timer/foehn-page-expiration-timer.component.mjs +147 -0
  8. package/esm2020/foehn-page/foehn-page.component.mjs +23 -19
  9. package/esm2020/foehn-page/foehn-page.module.mjs +14 -7
  10. package/esm2020/foehn-upload/foehn-multi-upload/pending-upload.service.mjs +2 -2
  11. package/esm2020/gesdem/gesdem-handler.service.mjs +3 -3
  12. package/esm2020/gesdem/gesdem-loader.guard.mjs +1 -1
  13. package/esm2020/gesdem-action-recovery/gesdem-action-recovery-registration/gesdem-action-recovery-registration.component.mjs +5 -2
  14. package/esm2020/index.mjs +3 -1
  15. package/esm2020/sdk-appinfo/application-info.mjs +3 -1
  16. package/esm2020/sdk-dictionary/default-dictionary.mjs +11 -4
  17. package/fesm2015/dsivd-prestations-ng.mjs +275 -21
  18. package/fesm2015/dsivd-prestations-ng.mjs.map +1 -1
  19. package/fesm2020/dsivd-prestations-ng.mjs +275 -21
  20. package/fesm2020/dsivd-prestations-ng.mjs.map +1 -1
  21. package/foehn-input/pattern.const.d.ts +1 -1
  22. package/foehn-page/foehn-page-expiration-timer/demande-expiration-interceptor.d.ts +15 -0
  23. package/foehn-page/foehn-page-expiration-timer/demande-expiration.service.d.ts +16 -0
  24. package/foehn-page/foehn-page-expiration-timer/foehn-page-expiration-timer.component.d.ts +32 -0
  25. package/foehn-page/foehn-page.component.d.ts +4 -1
  26. package/foehn-page/foehn-page.module.d.ts +15 -14
  27. package/gesdem/gesdem-handler.service.d.ts +1 -1
  28. package/index.d.ts +2 -0
  29. package/package.json +1 -1
  30. package/sdk-appinfo/application-info.d.ts +4 -0
  31. package/dsivd-prestations-ng-v16.4.0-beta.8.tgz +0 -0
package/CHANGELOG.md CHANGED
@@ -10,6 +10,20 @@
10
10
 
11
11
  ### Added
12
12
 
13
+ - [foehn-page-expiration-timer.component.ts](projects/prestations-ng/src/foehn-page/foehn-page-expiration-timer/foehn-page-expiration-timer.component.ts)
14
+ - [foehn-page-expiration-timer.component.html](projects/prestations-ng/src/foehn-page/foehn-page-expiration-timer/foehn-page-expiration-timer.component.html)
15
+
16
+ - added a timer message to alert user of session expiration
17
+ - `session-token.session-time-to-live-in-minutes` can be overridden in back-end properties
18
+ - `session-token.message-delay-in-minutes` can be overridden in back-end properties
19
+
20
+ - New dictionary keys:
21
+
22
+ - `foehn-page-expiration-timer.count-down-message` is the message displayed when timer is running
23
+ - `foehn-page-expiration-timer.count-down-message.sr-only` same as above but for screen reader
24
+ - `foehn-page-expiration-timer.expired-message` is the message displayed when session has expired
25
+ - `foehn-page-expiration-timer.expired-message.sr-only` same as above but for screen reader
26
+
13
27
  - [foehn-multi-upload.component.ts](projects/prestations-ng/src/foehn-upload/foehn-multi-upload/foehn-multi-upload.component.ts)
14
28
  - [foehn-bo-multi-upload.component.ts](projects/prestations-ng/src/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.component.ts)
15
29
 
@@ -18,11 +32,20 @@
18
32
 
19
33
  - [foehn-multi-upload.component.ts](projects/prestations-ng/src/foehn-upload/foehn-multi-upload/foehn-multi-upload.component.ts)
20
34
  - [foehn-bo-multi-upload.component.ts](projects/prestations-ng/src/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.component.ts)
35
+
21
36
  - added `@Input() maxFilesSizeInMo;`
22
37
  - prevents global upload of more than `maxFilesSizeInMo` Mo and displays an alert from default-dictionary.ts (`foehn-uploader.max-files-size-reached`)
23
38
 
39
+ - [gesdem-handler.service.ts](projects/prestations-ng/src/gesdem/gesdem-handler.service.ts)
40
+ - added a second optional parameter to `save(form: any, displaySuccessMessage: boolean = true): Observable<any>`
41
+ - `displaySuccessMessage` by default is true. When set to false, the form success saving message is not displayed
42
+
24
43
  ### Updated
25
44
 
45
+ - [foehn-page.component.html](projects/prestations-ng/src/foehn-page/foehn-page-expiration-timer/foehn-page-expiration-timer.component.html)
46
+
47
+ - updated `foehn-page` to add session expiration timer message
48
+
26
49
  - [gesdem-action-recovery-registration.component.ts](projects/prestations-ng/src/gesdem-action-recovery/gesdem-action-recovery-registration/gesdem-action-recovery-registration.component.ts)
27
50
 
28
51
  - updated recovery registration modal to inform the user of its current registration
@@ -41,9 +64,19 @@
41
64
  - `Integer draftDemRetentionDaysConnected : number` conservation duration of draft demands when connected (in days)
42
65
 
43
66
  - [I18NForm](projects/prestations-ng/src/i18n-form.ts)
67
+
44
68
  - added field `referenceInterne = ''`, since the reference interne can now be set via action recovery, it has to be kept in sync with the form
45
69
  - you can use this field to request the user for a reference interne.
46
70
 
71
+ - [pending-upload.service.ts](projects/prestations-ng/src/foehn-upload/foehn-multi-upload/pending-upload.service.ts)
72
+ - Does not display the form success saving message after saving pending files
73
+
74
+ ### Fixed
75
+
76
+ - [pattern.const](projects/prestations-ng/src/foehn-input/pattern.const.ts)
77
+
78
+ - fixed `HTML_PHONE_PATTERN` not escaping parenthesis
79
+
47
80
  ## [16.3.0] - must be aligned with prestations-be
48
81
 
49
82
  ### Added
package/UPGRADING_V16.md CHANGED
@@ -406,29 +406,48 @@ In your `app-routing.module.ts` of your application
406
406
  +canActivate: [gesdemLoaderGuard]
407
407
  ```
408
408
 
409
- #### Replacing `CanActivate`
409
+ #### Replacing `CanActivate` guard by `CanActiveFn`
410
410
 
411
- ##### Quick guard replacement
411
+ CanActivate, CanActivateChild, CanDeactivate, CanLoad or CanMatch have been deprecated.
412
412
 
413
- In your `redirect.guard.ts` file :
413
+ See [https://angular.io/api/router#structures](https://angular.io/api/router#structures).
414
414
 
415
- ```diff
416
- -export class RedirectGuard implements CanActivate {
417
- +export class RedirectGuard {
418
- canActivate(route: ActivatedRouteSnapshot): boolean {
419
- ```
415
+ You can find in the previous link a quick fix but it is better to rewrite your guard so it becomes a `CanActiveFn`, `CanActivateChildFn`, `CanDeactivateFn`, `CanLoadFn` or `CanMatchFn`.
420
416
 
421
- In your `app-routing.module.ts` of your application
417
+ ##### Rewriting examples
418
+
419
+ See [gesdemLoaderGuard generated doc](https://dsi-vd.github.io/prestations-ng/generateddoc/miscellaneous/variables.html#gesdemLoaderGuard) as an example.
420
+
421
+ Or here is an example of rewriting a `CanActivate` guard returning an `Observable` of `boolean` :
422
422
 
423
423
  ```diff
424
- -canActivate: [RedirectGuard],
425
- +canActivate: [(route: ActivatedRouteSnapshot) => inject(RedirectGuard).canActivate(route)],
424
+ - @Injectable({
425
+ - providedIn: 'root'
426
+ - })
427
+ - export class YourGuard implements CanActivate {
428
+ + export const yourGuard: CanActivateFn = (next: ActivatedRouteSnapshot): Observable<boolean> => {
429
+
430
+ - constructor(
431
+ - private service1: YourService1,
432
+ - private service2: YourService2
433
+ - ) {}
434
+ + const service1 = ServiceLocator.injector.get(YourService1);
435
+ + const service2 = ServiceLocator.injector.get(YourService2);
436
+
437
+ - canActivate(
438
+ - next: ActivatedRouteSnapshot
439
+ - ): Observable<boolean> {
440
+ if (YOUR_CONDITION) {
441
+ return of(false);
442
+ }
443
+ return of(true);
444
+ - }
445
+ }
426
446
  ```
427
447
 
428
- ##### Rewriting your guard
448
+ CanActivate, CanActivateChild, CanDeactivate, CanLoad or CanMatch will need the same approach to be rewritten.
429
449
 
430
- You can rewrite your guard to become a `CanActiveFn`.
431
- See [gesdemLoaderGuard generated doc](https://dsi-vd.github.io/prestations-ng/generateddoc/miscellaneous/variables.html#gesdemLoaderGuard) as an example.
450
+ They all return : `Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree;` same as the deprecated version of themselves.
432
451
 
433
452
  #### Replacing `.subscribe` with an error callback
434
453
 
Binary file
@@ -1,7 +1,7 @@
1
1
  // Patterns for HTML so iOS dans display the proper keyboard
2
2
  export const HTML_NO_DECIMAL_PATTERN = '[0-9]*';
3
3
  export const HTML_DECIMAL_PATTERN = '[0-9\\.,]*';
4
- export const HTML_PHONE_PATTERN = '[0-9\\.\\-()+]*';
4
+ export const HTML_PHONE_PATTERN = '[0-9\\.\\-\\(\\)+]*';
5
5
  // Validation patterns for the field
6
6
  export const NUMBERS_PATTERN = /^[0-9]*$/;
7
7
  export const DECIMAL_NUMBERS_PATTERN = /^([0-9]+\.?)?[0-9]*$/;
@@ -13,4 +13,4 @@ export const CLEAN_NUMBERS_PATTERN = /[^0-9]/g;
13
13
  export const CLEAN_DECIMAL_NUMBERS_PATTERN = /[^0-9\.]/g;
14
14
  export const CLEAN_NEGATIVE_NUMBERS_PATTERN = /[^0-9\-]/g;
15
15
  export const CLEAN_NEGATIVE_AND_DECIMAL_NUMBERS_PATTERN = /[^0-9\-\.]/g;
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybi5jb25zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1pbnB1dC9wYXR0ZXJuLmNvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxRQUFRLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsWUFBWSxDQUFDO0FBQ2pELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLGlCQUFpQixDQUFDO0FBRXBELG9DQUFvQztBQUNwQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDO0FBQzlELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLFlBQVksQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxvQ0FBb0MsR0FBRyx3QkFBd0IsQ0FBQztBQUU3RSxrRkFBa0Y7QUFDbEYsNENBQTRDO0FBQzVDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxXQUFXLENBQUM7QUFDekQsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsV0FBVyxDQUFDO0FBQzFELE1BQU0sQ0FBQyxNQUFNLDBDQUEwQyxHQUFHLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFBhdHRlcm5zIGZvciBIVE1MIHNvIGlPUyBkYW5zIGRpc3BsYXkgdGhlIHByb3BlciBrZXlib2FyZFxuZXhwb3J0IGNvbnN0IEhUTUxfTk9fREVDSU1BTF9QQVRURVJOID0gJ1swLTldKic7XG5leHBvcnQgY29uc3QgSFRNTF9ERUNJTUFMX1BBVFRFUk4gPSAnWzAtOVxcXFwuLF0qJztcbmV4cG9ydCBjb25zdCBIVE1MX1BIT05FX1BBVFRFUk4gPSAnWzAtOVxcXFwuXFxcXC0oKStdKic7XG5cbi8vIFZhbGlkYXRpb24gcGF0dGVybnMgZm9yIHRoZSBmaWVsZFxuZXhwb3J0IGNvbnN0IE5VTUJFUlNfUEFUVEVSTiA9IC9eWzAtOV0qJC87XG5leHBvcnQgY29uc3QgREVDSU1BTF9OVU1CRVJTX1BBVFRFUk4gPSAvXihbMC05XStcXC4/KT9bMC05XSokLztcbmV4cG9ydCBjb25zdCBORUdBVElWRV9OVU1CRVJTX1BBVFRFUk4gPSAvXi0/WzAtOV0qJC87XG5leHBvcnQgY29uc3QgTkVHQVRJVkVfQU5EX0RFQ0lNQUxfTlVNQkVSU19QQVRURVJOID0gL14tPyhbMC05XStcXC4/KT9bMC05XSokLztcblxuLy8gV2hlbiBjbGVhbmluZyB2YWx1ZXMsIHdlIHNhbml0aXplIHRoZSBpbnB1dCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IHRvIGhhbmRsZVxuLy8gaW52YWxpZCBpbnB1dCB3aXRob3V0IGJsb2NraW5nIHRoZSB2YWx1ZS5cbmV4cG9ydCBjb25zdCBDTEVBTl9OVU1CRVJTX1BBVFRFUk4gPSAvW14wLTldL2c7XG5leHBvcnQgY29uc3QgQ0xFQU5fREVDSU1BTF9OVU1CRVJTX1BBVFRFUk4gPSAvW14wLTlcXC5dL2c7XG5leHBvcnQgY29uc3QgQ0xFQU5fTkVHQVRJVkVfTlVNQkVSU19QQVRURVJOID0gL1teMC05XFwtXS9nO1xuZXhwb3J0IGNvbnN0IENMRUFOX05FR0FUSVZFX0FORF9ERUNJTUFMX05VTUJFUlNfUEFUVEVSTiA9IC9bXjAtOVxcLVxcLl0vZztcbiJdfQ==
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0dGVybi5jb25zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1pbnB1dC9wYXR0ZXJuLmNvbnN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxRQUFRLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsWUFBWSxDQUFDO0FBQ2pELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDO0FBRXhELG9DQUFvQztBQUNwQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLHNCQUFzQixDQUFDO0FBQzlELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLFlBQVksQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxvQ0FBb0MsR0FBRyx3QkFBd0IsQ0FBQztBQUU3RSxrRkFBa0Y7QUFDbEYsNENBQTRDO0FBQzVDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxXQUFXLENBQUM7QUFDekQsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsV0FBVyxDQUFDO0FBQzFELE1BQU0sQ0FBQyxNQUFNLDBDQUEwQyxHQUFHLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFBhdHRlcm5zIGZvciBIVE1MIHNvIGlPUyBkYW5zIGRpc3BsYXkgdGhlIHByb3BlciBrZXlib2FyZFxuZXhwb3J0IGNvbnN0IEhUTUxfTk9fREVDSU1BTF9QQVRURVJOID0gJ1swLTldKic7XG5leHBvcnQgY29uc3QgSFRNTF9ERUNJTUFMX1BBVFRFUk4gPSAnWzAtOVxcXFwuLF0qJztcbmV4cG9ydCBjb25zdCBIVE1MX1BIT05FX1BBVFRFUk4gPSAnWzAtOVxcXFwuXFxcXC1cXFxcKFxcXFwpK10qJztcblxuLy8gVmFsaWRhdGlvbiBwYXR0ZXJucyBmb3IgdGhlIGZpZWxkXG5leHBvcnQgY29uc3QgTlVNQkVSU19QQVRURVJOID0gL15bMC05XSokLztcbmV4cG9ydCBjb25zdCBERUNJTUFMX05VTUJFUlNfUEFUVEVSTiA9IC9eKFswLTldK1xcLj8pP1swLTldKiQvO1xuZXhwb3J0IGNvbnN0IE5FR0FUSVZFX05VTUJFUlNfUEFUVEVSTiA9IC9eLT9bMC05XSokLztcbmV4cG9ydCBjb25zdCBORUdBVElWRV9BTkRfREVDSU1BTF9OVU1CRVJTX1BBVFRFUk4gPSAvXi0/KFswLTldK1xcLj8pP1swLTldKiQvO1xuXG4vLyBXaGVuIGNsZWFuaW5nIHZhbHVlcywgd2Ugc2FuaXRpemUgdGhlIGlucHV0IGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlXG4vLyBpbnZhbGlkIGlucHV0IHdpdGhvdXQgYmxvY2tpbmcgdGhlIHZhbHVlLlxuZXhwb3J0IGNvbnN0IENMRUFOX05VTUJFUlNfUEFUVEVSTiA9IC9bXjAtOV0vZztcbmV4cG9ydCBjb25zdCBDTEVBTl9ERUNJTUFMX05VTUJFUlNfUEFUVEVSTiA9IC9bXjAtOVxcLl0vZztcbmV4cG9ydCBjb25zdCBDTEVBTl9ORUdBVElWRV9OVU1CRVJTX1BBVFRFUk4gPSAvW14wLTlcXC1dL2c7XG5leHBvcnQgY29uc3QgQ0xFQU5fTkVHQVRJVkVfQU5EX0RFQ0lNQUxfTlVNQkVSU19QQVRURVJOID0gL1teMC05XFwtXFwuXS9nO1xuIl19
@@ -0,0 +1,62 @@
1
+ import { HTTP_INTERCEPTORS, HttpEventType, HttpResponse } from '@angular/common/http';
2
+ import { Injectable } from '@angular/core';
3
+ import dayjs from 'dayjs';
4
+ import { tap } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "./demande-expiration.service";
7
+ export class DemandeExpirationInterceptor {
8
+ constructor(demandeExpirationService) {
9
+ this.demandeExpirationService = demandeExpirationService;
10
+ }
11
+ intercept(request, next) {
12
+ return next.handle(request).pipe(tap((httpEvent) => {
13
+ if (httpEvent.type === HttpEventType.Sent) {
14
+ return;
15
+ }
16
+ if (httpEvent instanceof HttpResponse) {
17
+ if (httpEvent.headers.has('Demande-Expiration')) {
18
+ this.manageDemandeExpirationHeader(httpEvent.headers.get('Demande-Expiration'),
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ httpEvent.body);
21
+ }
22
+ }
23
+ }));
24
+ }
25
+ manageDemandeExpirationHeader(expirationByDemande,
26
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
+ formPostResponse) {
28
+ const expirationByDemandeMap = this.getExpirationByDemandeMap(expirationByDemande);
29
+ if (!!formPostResponse.meta) {
30
+ const dateTime = expirationByDemandeMap.get(formPostResponse.meta.reference);
31
+ const dateTimeAsDayJs = dayjs(dateTime);
32
+ if (dateTimeAsDayJs.isValid()) {
33
+ this.demandeExpirationService.setDemandeExpirationDateTime(dayjs(dateTime));
34
+ }
35
+ }
36
+ }
37
+ getExpirationByDemandeMap(expirationByDemande) {
38
+ const myMap = new Map();
39
+ const expirationByDemandesAsArray = expirationByDemande.split(';');
40
+ expirationByDemandesAsArray.forEach(value => {
41
+ const valueAsArray = value.split(',');
42
+ myMap.set(valueAsArray[0], new Date(valueAsArray[1]));
43
+ });
44
+ return myMap;
45
+ }
46
+ }
47
+ DemandeExpirationInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DemandeExpirationInterceptor, deps: [{ token: i1.DemandeExpirationService }], target: i0.ɵɵFactoryTarget.Injectable });
48
+ DemandeExpirationInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DemandeExpirationInterceptor, providedIn: 'root' });
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DemandeExpirationInterceptor, decorators: [{
50
+ type: Injectable,
51
+ args: [{
52
+ providedIn: 'root'
53
+ }]
54
+ }], ctorParameters: function () { return [{ type: i1.DemandeExpirationService }]; } });
55
+ export const DEMANDE_EXPIRATION_INTERCEPTOR_PROVIDER = [
56
+ {
57
+ provide: HTTP_INTERCEPTORS,
58
+ useExisting: DemandeExpirationInterceptor,
59
+ multi: true
60
+ }
61
+ ];
62
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVtYW5kZS1leHBpcmF0aW9uLWludGVyY2VwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJlc3RhdGlvbnMtbmcvc3JjL2ZvZWhuLXBhZ2UvZm9laG4tcGFnZS1leHBpcmF0aW9uLXRpbWVyL2RlbWFuZGUtZXhwaXJhdGlvbi1pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBRWpCLGFBQWEsRUFJYixZQUFZLEVBQ2YsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQW9CLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFjLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7O0FBUXZDLE1BQU0sT0FBTyw0QkFBNEI7SUFDckMsWUFBb0Isd0JBQWtEO1FBQWxELDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7SUFBRyxDQUFDO0lBRTFFLFNBQVMsQ0FDTCxPQUE2QixFQUM3QixJQUFpQjtRQUVqQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUM1QixHQUFHLENBQUMsQ0FBQyxTQUE2QixFQUFFLEVBQUU7WUFDbEMsSUFBSSxTQUFTLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3ZDLE9BQU87YUFDVjtZQUNELElBQUksU0FBUyxZQUFZLFlBQVksRUFBRTtnQkFDbkMsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO29CQUM3QyxJQUFJLENBQUMsNkJBQTZCLENBQzlCLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDO29CQUMzQyw4REFBOEQ7b0JBQzlELFNBQVMsQ0FBQyxJQUE2QixDQUMxQyxDQUFDO2lCQUNMO2FBQ0o7UUFDTCxDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVPLDZCQUE2QixDQUNqQyxtQkFBMkI7SUFDM0IsOERBQThEO0lBQzlELGdCQUF1QztRQUV2QyxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FDekQsbUJBQW1CLENBQ3RCLENBQUM7UUFDRixJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7WUFDekIsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxDQUN2QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNsQyxDQUFDO1lBQ0YsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLElBQUksZUFBZSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUMzQixJQUFJLENBQUMsd0JBQXdCLENBQUMsNEJBQTRCLENBQ3RELEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FDbEIsQ0FBQzthQUNMO1NBQ0o7SUFDTCxDQUFDO0lBRU8seUJBQXlCLENBQzdCLG1CQUEyQjtRQUUzQixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBZ0IsQ0FBQztRQUN0QyxNQUFNLDJCQUEyQixHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuRSwyQkFBMkIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDeEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQzs7eUhBeERRLDRCQUE0Qjs2SEFBNUIsNEJBQTRCLGNBRnpCLE1BQU07MkZBRVQsNEJBQTRCO2tCQUh4QyxVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7QUE0REQsTUFBTSxDQUFDLE1BQU0sdUNBQXVDLEdBQXVCO0lBQ3ZFO1FBQ0ksT0FBTyxFQUFFLGlCQUFpQjtRQUMxQixXQUFXLEVBQUUsNEJBQTRCO1FBQ3pDLEtBQUssRUFBRSxJQUFJO0tBQ2Q7Q0FDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBIVFRQX0lOVEVSQ0VQVE9SUyxcbiAgICBIdHRwRXZlbnQsXG4gICAgSHR0cEV2ZW50VHlwZSxcbiAgICBIdHRwSGFuZGxlcixcbiAgICBIdHRwSW50ZXJjZXB0b3IsXG4gICAgSHR0cFJlcXVlc3QsXG4gICAgSHR0cFJlc3BvbnNlXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEV4aXN0aW5nUHJvdmlkZXIsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRm9ybVBvc3RSZXNwb25zZSB9IGZyb20gJy4uLy4uL2Zvcm0tcG9zdC1yZXNwb25zZSc7XG5pbXBvcnQgeyBEZW1hbmRlRXhwaXJhdGlvblNlcnZpY2UgfSBmcm9tICcuL2RlbWFuZGUtZXhwaXJhdGlvbi5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEZW1hbmRlRXhwaXJhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRlbWFuZGVFeHBpcmF0aW9uU2VydmljZTogRGVtYW5kZUV4cGlyYXRpb25TZXJ2aWNlKSB7fVxuXG4gICAgaW50ZXJjZXB0KFxuICAgICAgICByZXF1ZXN0OiBIdHRwUmVxdWVzdDx1bmtub3duPixcbiAgICAgICAgbmV4dDogSHR0cEhhbmRsZXJcbiAgICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDx1bmtub3duPj4ge1xuICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdCkucGlwZShcbiAgICAgICAgICAgIHRhcCgoaHR0cEV2ZW50OiBIdHRwRXZlbnQ8dW5rbm93bj4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaHR0cEV2ZW50LnR5cGUgPT09IEh0dHBFdmVudFR5cGUuU2VudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChodHRwRXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0dHBFdmVudC5oZWFkZXJzLmhhcygnRGVtYW5kZS1FeHBpcmF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlRGVtYW5kZUV4cGlyYXRpb25IZWFkZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cEV2ZW50LmhlYWRlcnMuZ2V0KCdEZW1hbmRlLUV4cGlyYXRpb24nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBFdmVudC5ib2R5IGFzIEZvcm1Qb3N0UmVzcG9uc2U8YW55PlxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYW5hZ2VEZW1hbmRlRXhwaXJhdGlvbkhlYWRlcihcbiAgICAgICAgZXhwaXJhdGlvbkJ5RGVtYW5kZTogc3RyaW5nLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBmb3JtUG9zdFJlc3BvbnNlOiBGb3JtUG9zdFJlc3BvbnNlPGFueT5cbiAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXhwaXJhdGlvbkJ5RGVtYW5kZU1hcCA9IHRoaXMuZ2V0RXhwaXJhdGlvbkJ5RGVtYW5kZU1hcChcbiAgICAgICAgICAgIGV4cGlyYXRpb25CeURlbWFuZGVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCEhZm9ybVBvc3RSZXNwb25zZS5tZXRhKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlVGltZSA9IGV4cGlyYXRpb25CeURlbWFuZGVNYXAuZ2V0KFxuICAgICAgICAgICAgICAgIGZvcm1Qb3N0UmVzcG9uc2UubWV0YS5yZWZlcmVuY2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBkYXRlVGltZUFzRGF5SnMgPSBkYXlqcyhkYXRlVGltZSk7XG4gICAgICAgICAgICBpZiAoZGF0ZVRpbWVBc0RheUpzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVtYW5kZUV4cGlyYXRpb25TZXJ2aWNlLnNldERlbWFuZGVFeHBpcmF0aW9uRGF0ZVRpbWUoXG4gICAgICAgICAgICAgICAgICAgIGRheWpzKGRhdGVUaW1lKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEV4cGlyYXRpb25CeURlbWFuZGVNYXAoXG4gICAgICAgIGV4cGlyYXRpb25CeURlbWFuZGU6IHN0cmluZ1xuICAgICk6IE1hcDxzdHJpbmcsIERhdGU+IHtcbiAgICAgICAgY29uc3QgbXlNYXAgPSBuZXcgTWFwPHN0cmluZywgRGF0ZT4oKTtcbiAgICAgICAgY29uc3QgZXhwaXJhdGlvbkJ5RGVtYW5kZXNBc0FycmF5ID0gZXhwaXJhdGlvbkJ5RGVtYW5kZS5zcGxpdCgnOycpO1xuICAgICAgICBleHBpcmF0aW9uQnlEZW1hbmRlc0FzQXJyYXkuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFzQXJyYXkgPSB2YWx1ZS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgbXlNYXAuc2V0KHZhbHVlQXNBcnJheVswXSwgbmV3IERhdGUodmFsdWVBc0FycmF5WzFdKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbXlNYXA7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgREVNQU5ERV9FWFBJUkFUSU9OX0lOVEVSQ0VQVE9SX1BST1ZJREVSOiBFeGlzdGluZ1Byb3ZpZGVyW10gPSBbXG4gICAge1xuICAgICAgICBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SUyxcbiAgICAgICAgdXNlRXhpc3Rpbmc6IERlbWFuZGVFeHBpcmF0aW9uSW50ZXJjZXB0b3IsXG4gICAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuXTtcbiJdfQ==
@@ -0,0 +1,46 @@
1
+ import { Injectable } from '@angular/core';
2
+ import dayjs from 'dayjs';
3
+ import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
4
+ import { filter, map, shareReplay, tap } from 'rxjs/operators';
5
+ import * as i0 from "@angular/core";
6
+ export class DemandeExpirationService {
7
+ constructor() {
8
+ this.PULLING_IN_MILLISECONDS = 1000;
9
+ this._demandeExpirationDateTimeSubject = new BehaviorSubject(null);
10
+ this.intervalSubject = new Subject();
11
+ }
12
+ shouldDisplayExpirationTimerMessage() {
13
+ return combineLatest([
14
+ this.getDemandeExpirationDateTime(),
15
+ this.intervalSubject.asObservable()
16
+ ]).pipe(map(([value]) => dayjs().isSame(value) || dayjs().isAfter(value)), tap(visible => {
17
+ if (visible) {
18
+ this.clearPulling();
19
+ }
20
+ }), shareReplay(1));
21
+ }
22
+ setDemandeExpirationDateTime(date) {
23
+ this._demandeExpirationDateTimeSubject.next(date);
24
+ }
25
+ getDemandeExpirationDateTime() {
26
+ return this._demandeExpirationDateTimeSubject.asObservable().pipe(filter(value => !!value && value.isValid()), tap(() => this.startPulling()), shareReplay(1));
27
+ }
28
+ startPulling() {
29
+ this.clearPulling();
30
+ this.interval = setInterval(() => {
31
+ this.intervalSubject.next();
32
+ }, this.PULLING_IN_MILLISECONDS);
33
+ }
34
+ clearPulling() {
35
+ clearInterval(this.interval);
36
+ }
37
+ }
38
+ DemandeExpirationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DemandeExpirationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
39
+ DemandeExpirationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DemandeExpirationService, providedIn: 'root' });
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DemandeExpirationService, decorators: [{
41
+ type: Injectable,
42
+ args: [{
43
+ providedIn: 'root'
44
+ }]
45
+ }] });
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVtYW5kZS1leHBpcmF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmVzdGF0aW9ucy1uZy9zcmMvZm9laG4tcGFnZS9mb2Vobi1wYWdlLWV4cGlyYXRpb24tdGltZXIvZGVtYW5kZS1leHBpcmF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFLL0QsTUFBTSxPQUFPLHdCQUF3QjtJQUhyQztRQU9xQiw0QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFFeEMsc0NBQWlDLEdBQWlDLElBQUksZUFBZSxDQUN6RixJQUFJLENBQ1AsQ0FBQztRQUNNLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztLQXVDakQ7SUFyQ0csbUNBQW1DO1FBQy9CLE9BQU8sYUFBYSxDQUFDO1lBQ2pCLElBQUksQ0FBQyw0QkFBNEIsRUFBRTtZQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRTtTQUN0QyxDQUFDLENBQUMsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDakUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3ZCO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNqQixDQUFDO0lBQ04sQ0FBQztJQUVELDRCQUE0QixDQUFDLElBQWlCO1FBQzFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVPLDRCQUE0QjtRQUNoQyxPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQzdELE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQzNDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFDOUIsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNqQixDQUFDO0lBQ04sQ0FBQztJQUVPLFlBQVk7UUFDaEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hDLENBQUMsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU8sWUFBWTtRQUNoQixhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7O3FIQS9DUSx3QkFBd0I7eUhBQXhCLHdCQUF3QixjQUZyQixNQUFNOzJGQUVULHdCQUF3QjtrQkFIcEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc2hhcmVSZXBsYXksIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEZW1hbmRlRXhwaXJhdGlvblNlcnZpY2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJpdmF0ZSBpbnRlcnZhbDogYW55O1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBQVUxMSU5HX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5cbiAgICBwcml2YXRlIF9kZW1hbmRlRXhwaXJhdGlvbkRhdGVUaW1lU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PGRheWpzLkRheWpzPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8ZGF5anMuRGF5anM+KFxuICAgICAgICBudWxsXG4gICAgKTtcbiAgICBwcml2YXRlIGludGVydmFsU3ViamVjdCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICBzaG91bGREaXNwbGF5RXhwaXJhdGlvblRpbWVyTWVzc2FnZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgICAgdGhpcy5nZXREZW1hbmRlRXhwaXJhdGlvbkRhdGVUaW1lKCksXG4gICAgICAgICAgICB0aGlzLmludGVydmFsU3ViamVjdC5hc09ic2VydmFibGUoKVxuICAgICAgICBdKS5waXBlKFxuICAgICAgICAgICAgbWFwKChbdmFsdWVdKSA9PiBkYXlqcygpLmlzU2FtZSh2YWx1ZSkgfHwgZGF5anMoKS5pc0FmdGVyKHZhbHVlKSksXG4gICAgICAgICAgICB0YXAodmlzaWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclB1bGxpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0RGVtYW5kZUV4cGlyYXRpb25EYXRlVGltZShkYXRlOiBkYXlqcy5EYXlqcyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kZW1hbmRlRXhwaXJhdGlvbkRhdGVUaW1lU3ViamVjdC5uZXh0KGRhdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGVtYW5kZUV4cGlyYXRpb25EYXRlVGltZSgpOiBPYnNlcnZhYmxlPGRheWpzLkRheWpzPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZW1hbmRlRXhwaXJhdGlvbkRhdGVUaW1lU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKHZhbHVlID0+ICEhdmFsdWUgJiYgdmFsdWUuaXNWYWxpZCgpKSxcbiAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLnN0YXJ0UHVsbGluZygpKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFB1bGxpbmcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xlYXJQdWxsaW5nKCk7XG4gICAgICAgIHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmludGVydmFsU3ViamVjdC5uZXh0KCk7XG4gICAgICAgIH0sIHRoaXMuUFVMTElOR19JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJQdWxsaW5nKCk6IHZvaWQge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,147 @@
1
+ import { Component } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { debounceTime, filter, map, shareReplay, tap } from 'rxjs/operators';
4
+ import { DateHelper } from '../../sdk-date/date.helper';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../sdk-appinfo/application-info.service";
7
+ import * as i2 from "../..//sdk-dictionary/sdk-dictionary.service";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "../../sdk-dictionary/sdk-dictionary.pipe";
10
+ export class FoehnPageExpirationTimerComponent {
11
+ constructor(applicationInfoService, dictionaryService) {
12
+ this.applicationInfoService = applicationInfoService;
13
+ this.dictionaryService = dictionaryService;
14
+ this.countDownTimeInSeconds = new BehaviorSubject(null);
15
+ this.sessionHasExpired = new BehaviorSubject(false);
16
+ this.srAnnouncementsSubject = new BehaviorSubject('');
17
+ this.dateHelper = new DateHelper();
18
+ this.PULLING_IN_MILLISECONDS = 1000;
19
+ this.SR_ANNOUNCEMENT_CLEAR_TIMEOUT_INTERVAL_MS = 2000;
20
+ this.sessionExpired = this.sessionHasExpired
21
+ .asObservable()
22
+ .pipe(shareReplay(1));
23
+ this.srAnnouncements = this.srAnnouncementsSubject
24
+ .asObservable()
25
+ .pipe(debounceTime(0)); // debounceTime to "avoid expression has changes before..."
26
+ this.countDownTimeToDisplay = this.countDownTimeInSeconds
27
+ .asObservable()
28
+ .pipe(tap(countDownTimeInSeconds => this.sessionHasExpired.next(countDownTimeInSeconds === 0)), map(countDownTimeInSeconds => this.formatTime(countDownTimeInSeconds)), shareReplay(1));
29
+ this.applicationInfoRetrieved = this.applicationInfoService.data.pipe(map((info) => info.configuration.session.messageDelayInMinutes), filter(messageDelayInMinutes => !!messageDelayInMinutes), tap(messageDelayInMinutes => this.countDownTimeInSeconds.next(messageDelayInMinutes * 60)), map(() => true), shareReplay(1));
30
+ }
31
+ ngAfterViewInit() {
32
+ this.startTimer();
33
+ }
34
+ ngOnDestroy() {
35
+ this.clearTimer();
36
+ }
37
+ startTimer() {
38
+ this.interval = setInterval(() => {
39
+ let time = this.countDownTimeInSeconds.getValue();
40
+ if (time === 0) {
41
+ this.clearTimer();
42
+ return;
43
+ }
44
+ time -= 1;
45
+ this.countDownTimeInSeconds.next(time);
46
+ }, this.PULLING_IN_MILLISECONDS);
47
+ }
48
+ clearTimer() {
49
+ clearInterval(this.interval);
50
+ }
51
+ formatTime(timeInSeconds) {
52
+ const hours = Math.floor(timeInSeconds / (60 * 60));
53
+ const divisor_for_minutes = timeInSeconds % (60 * 60);
54
+ const minutes = Math.floor(divisor_for_minutes / 60);
55
+ const divisor_for_seconds = divisor_for_minutes % 60;
56
+ const seconds = Math.ceil(divisor_for_seconds);
57
+ this.manageScreenReaderAnnouncement(timeInSeconds, hours, minutes, seconds);
58
+ const leftPadHours = this.dateHelper.leftPad(hours.toString());
59
+ const leftPadMinutes = this.dateHelper.leftPad(minutes.toString());
60
+ const leftPadSeconds = this.dateHelper.leftPad(seconds.toString());
61
+ return `${leftPadHours}:${leftPadMinutes}:${leftPadSeconds}`;
62
+ }
63
+ announceSrMessage(msg) {
64
+ clearTimeout(this.srAnnouncementClearTimer);
65
+ this.srAnnouncementsSubject.next(msg);
66
+ this.srAnnouncementClearTimer = setTimeout(() => {
67
+ this.srAnnouncementsSubject.next('');
68
+ }, this.SR_ANNOUNCEMENT_CLEAR_TIMEOUT_INTERVAL_MS);
69
+ }
70
+ getReadableTimerForScreenReader(hours, minutes, seconds) {
71
+ if (!hours && !minutes && !seconds) {
72
+ return '';
73
+ }
74
+ if (!!hours && !minutes && !seconds) {
75
+ return `${hours} heures`;
76
+ }
77
+ if (!!minutes && !hours && !seconds) {
78
+ return `${minutes} minutes`;
79
+ }
80
+ if (!!seconds && !minutes && !hours) {
81
+ return `${seconds} secondes`;
82
+ }
83
+ if (!!hours && !!minutes && !!seconds) {
84
+ return `${hours} heures ${minutes} minutes et ${seconds} secondes`;
85
+ }
86
+ if (!!hours && !!minutes && !seconds) {
87
+ return `${hours} heures et ${minutes} minutes`;
88
+ }
89
+ if (!!hours && !!seconds && !minutes) {
90
+ return `${hours} heures et ${seconds} secondes`;
91
+ }
92
+ if (!!minutes && !!seconds && !hours) {
93
+ return `${minutes} minutes et ${seconds} secondes`;
94
+ }
95
+ }
96
+ manageScreenReaderAnnouncement(timeInSeconds, hours, minutes, seconds) {
97
+ const _1_hourInSeconds = 60 * 60;
98
+ const _5_minutesInSeconds = 5 * 60;
99
+ const _10_minutesInSeconds = 10 * 60;
100
+ const _1_minuteInSeconds = 60;
101
+ const _2_minuteInSeconds = 2 * 60;
102
+ // When finished, display expired message
103
+ if (timeInSeconds === 0) {
104
+ this.srAnnouncementsSubject.next(this.dictionaryService.getKeySync('foehn-page-expiration-timer.expired-message.sr-only'));
105
+ return;
106
+ }
107
+ // Every second for the last 15s
108
+ if (timeInSeconds <= 15) {
109
+ this.srAnnouncementsSubject.next(timeInSeconds.toString());
110
+ return;
111
+ }
112
+ // Every 30s when less than 2 minutes
113
+ if (timeInSeconds <= _2_minuteInSeconds && timeInSeconds % 30 === 0) {
114
+ const msg = this.getReadableTimerForScreenReader(hours, minutes, seconds);
115
+ this.announceSrMessage(this.dictionaryService.getKeySync('foehn-page-expiration-timer.count-down-message.sr-only', { countDownValue: msg }));
116
+ return;
117
+ }
118
+ // Every minute for the last 5 minutes
119
+ if (timeInSeconds <= _5_minutesInSeconds &&
120
+ timeInSeconds % _1_minuteInSeconds === 0) {
121
+ const msg = this.getReadableTimerForScreenReader(hours, minutes, seconds);
122
+ this.announceSrMessage(this.dictionaryService.getKeySync('foehn-page-expiration-timer.count-down-message.sr-only', { countDownValue: msg }));
123
+ return;
124
+ }
125
+ // Every 10 minutes when less than an hour
126
+ if (timeInSeconds < _1_hourInSeconds &&
127
+ timeInSeconds % _10_minutesInSeconds === 0) {
128
+ const msg = this.getReadableTimerForScreenReader(hours, minutes, seconds);
129
+ this.announceSrMessage(this.dictionaryService.getKeySync('foehn-page-expiration-timer.count-down-message.sr-only', { countDownValue: msg }));
130
+ return;
131
+ }
132
+ // Every hour when more than an hour
133
+ if (timeInSeconds >= _1_hourInSeconds &&
134
+ timeInSeconds % _1_hourInSeconds === 0) {
135
+ const msg = this.getReadableTimerForScreenReader(hours, minutes, seconds);
136
+ this.announceSrMessage(this.dictionaryService.getKeySync('foehn-page-expiration-timer.count-down-message.sr-only', { countDownValue: msg }));
137
+ return;
138
+ }
139
+ }
140
+ }
141
+ FoehnPageExpirationTimerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FoehnPageExpirationTimerComponent, deps: [{ token: i1.ApplicationInfoService }, { token: i2.SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Component });
142
+ FoehnPageExpirationTimerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: FoehnPageExpirationTimerComponent, selector: "foehn-page-expiration-timer", ngImport: i0, template: "<div\n *ngIf=\"applicationInfoRetrieved | async\"\n class=\"sticky-top alert text-center my-0\"\n [class.alert-warning]=\"(sessionExpired | async) === false\"\n [class.alert-danger]=\"(sessionExpired | async) === true\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n>\n <div\n *ngIf=\"(sessionExpired | async) === false\"\n [innerHTML]=\"\n 'foehn-page-expiration-timer.count-down-message'\n | fromDictionary\n : { countDownValue: countDownTimeToDisplay | async }\n \"\n ></div>\n <div\n *ngIf=\"(sessionExpired | async) === true\"\n [innerHTML]=\"\n 'foehn-page-expiration-timer.expired-message' | fromDictionary\n \"\n ></div>\n</div>\n\n<p class=\"sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">\n {{ srAnnouncements | async }}\n</p>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.SdkDictionaryPipe, name: "fromDictionary" }] });
143
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FoehnPageExpirationTimerComponent, decorators: [{
144
+ type: Component,
145
+ args: [{ selector: 'foehn-page-expiration-timer', template: "<div\n *ngIf=\"applicationInfoRetrieved | async\"\n class=\"sticky-top alert text-center my-0\"\n [class.alert-warning]=\"(sessionExpired | async) === false\"\n [class.alert-danger]=\"(sessionExpired | async) === true\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n>\n <div\n *ngIf=\"(sessionExpired | async) === false\"\n [innerHTML]=\"\n 'foehn-page-expiration-timer.count-down-message'\n | fromDictionary\n : { countDownValue: countDownTimeToDisplay | async }\n \"\n ></div>\n <div\n *ngIf=\"(sessionExpired | async) === true\"\n [innerHTML]=\"\n 'foehn-page-expiration-timer.expired-message' | fromDictionary\n \"\n ></div>\n</div>\n\n<p class=\"sr-only\" aria-live=\"assertive\" aria-atomic=\"true\">\n {{ srAnnouncements | async }}\n</p>\n" }]
146
+ }], ctorParameters: function () { return [{ type: i1.ApplicationInfoService }, { type: i2.SdkDictionaryService }]; } });
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4tcGFnZS1leHBpcmF0aW9uLXRpbWVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1wYWdlL2ZvZWhuLXBhZ2UtZXhwaXJhdGlvbi10aW1lci9mb2Vobi1wYWdlLWV4cGlyYXRpb24tdGltZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJlc3RhdGlvbnMtbmcvc3JjL2ZvZWhuLXBhZ2UvZm9laG4tcGFnZS1leHBpcmF0aW9uLXRpbWVyL2ZvZWhuLXBhZ2UtZXhwaXJhdGlvbi10aW1lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7Ozs7QUFNeEQsTUFBTSxPQUFPLGlDQUFpQztJQW9CMUMsWUFDWSxzQkFBOEMsRUFDOUMsaUJBQXVDO1FBRHZDLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFzQjtRQWYzQywyQkFBc0IsR0FBRyxJQUFJLGVBQWUsQ0FBUyxJQUFJLENBQUMsQ0FBQztRQUMzRCxzQkFBaUIsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN4RCwyQkFBc0IsR0FBRyxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUl6RCxlQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUVyQiw0QkFBdUIsR0FBRyxJQUFJ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R0FBRyxJQUFJLENBQUMsK0JBQStCLENBQzVDLEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxDQUNWLENBQUM7WUFDRixJQUFJLENBQUMsaUJBQWlCLENBQ2xCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQzdCLHdEQUF3RCxFQUN4RCxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FDMUIsQ0FDSixDQUFDO1lBQ0YsT0FBTztTQUNWO1FBQ0Qsb0NBQW9DO1FBQ3BDLElBQ0ksYUFBYSxJQUFJLGdCQUFnQjtZQUNqQyxhQUFhLEdBQUcsZ0JBQWdCLEtBQUssQ0FBQyxFQUN4QztZQUNFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FDNUMsS0FBSyxFQUNMLE9BQU8sRUFDUCxPQUFPLENBQ1YsQ0FBQztZQUNGLElBQUksQ0FBQyxpQkFBaUIsQ0FDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FDN0Isd0RBQXdELEVBQ3hELEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUMxQixDQUNKLENBQUM7WUFDRixPQUFPO1NBQ1Y7SUFDTCxDQUFDOzs4SEFoUFEsaUNBQWlDO2tIQUFqQyxpQ0FBaUMsbUVDYjlDLDIyQkEyQkE7MkZEZGEsaUNBQWlDO2tCQUo3QyxTQUFTOytCQUNJLDZCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5LCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNka0RpY3Rpb25hcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vL3Nkay1kaWN0aW9uYXJ5L3Nkay1kaWN0aW9uYXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25JbmZvIH0gZnJvbSAnLi4vLi4vc2RrLWFwcGluZm8vYXBwbGljYXRpb24taW5mbyc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2RrLWFwcGluZm8vYXBwbGljYXRpb24taW5mby5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVIZWxwZXIgfSBmcm9tICcuLi8uLi9zZGstZGF0ZS9kYXRlLmhlbHBlcic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZm9laG4tcGFnZS1leHBpcmF0aW9uLXRpbWVyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9laG4tcGFnZS1leHBpcmF0aW9uLXRpbWVyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBGb2VoblBhZ2VFeHBpcmF0aW9uVGltZXJDb21wb25lbnRcbiAgICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgYXBwbGljYXRpb25JbmZvUmV0cmlldmVkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIGNvdW50RG93blRpbWVUb0Rpc3BsYXk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICBzZXNzaW9uRXhwaXJlZDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBzckFubm91bmNlbWVudHM6IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICAgIHByaXZhdGUgY291bnREb3duVGltZUluU2Vjb25kcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihudWxsKTtcbiAgICBwcml2YXRlIHNlc3Npb25IYXNFeHBpcmVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSBzckFubm91bmNlbWVudHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJpdmF0ZSBpbnRlcnZhbDogYW55O1xuICAgIHByaXZhdGUgZGF0ZUhlbHBlciA9IG5ldyBEYXRlSGVscGVyKCk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IFBVTExJTkdfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByaXZhdGUgc3JBbm5vdW5jZW1lbnRDbGVhclRpbWVyOiBhbnk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBTUl9BTk5PVU5DRU1FTlRfQ0xFQVJfVElNRU9VVF9JTlRFUlZBTF9NUyA9IDIwMDA7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBhcHBsaWNhdGlvbkluZm9TZXJ2aWNlOiBBcHBsaWNhdGlvbkluZm9TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGRpY3Rpb25hcnlTZXJ2aWNlOiBTZGtEaWN0aW9uYXJ5U2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLnNlc3Npb25FeHBpcmVkID0gdGhpcy5zZXNzaW9uSGFzRXhwaXJlZFxuICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAucGlwZShzaGFyZVJlcGxheSgxKSk7XG5cbiAgICAgICAgdGhpcy5zckFubm91bmNlbWVudHMgPSB0aGlzLnNyQW5ub3VuY2VtZW50c1N1YmplY3RcbiAgICAgICAgICAgIC5hc09ic2VydmFibGUoKVxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDApKTsgLy8gZGVib3VuY2VUaW1lIHRvIFwiYXZvaWQgZXhwcmVzc2lvbiBoYXMgY2hhbmdlcyBiZWZvcmUuLi5cIlxuXG4gICAgICAgIHRoaXMuY291bnREb3duVGltZVRvRGlzcGxheSA9IHRoaXMuY291bnREb3duVGltZUluU2Vjb25kc1xuICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoY291bnREb3duVGltZUluU2Vjb25kcyA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25IYXNFeHBpcmVkLm5leHQoY291bnREb3duVGltZUluU2Vjb25kcyA9PT0gMClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG1hcChjb3VudERvd25UaW1lSW5TZWNvbmRzID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0VGltZShjb3VudERvd25UaW1lSW5TZWNvbmRzKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkluZm9SZXRyaWV2ZWQgPSB0aGlzLmFwcGxpY2F0aW9uSW5mb1NlcnZpY2UuZGF0YS5waXBlKFxuICAgICAgICAgICAgbWFwKFxuICAgICAgICAgICAgICAgIChpbmZvOiBBcHBsaWNhdGlvbkluZm8pID0+XG4gICAgICAgICAgICAgICAgICAgIGluZm8uY29uZmlndXJhdGlvbi5zZXNzaW9uLm1lc3NhZ2VEZWxheUluTWludXRlc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZpbHRlcihtZXNzYWdlRGVsYXlJbk1pbnV0ZXMgPT4gISFtZXNzYWdlRGVsYXlJbk1pbnV0ZXMpLFxuICAgICAgICAgICAgdGFwKG1lc3NhZ2VEZWxheUluTWludXRlcyA9PlxuICAgICAgICAgICAgICAgIHRoaXMuY291bnREb3duVGltZUluU2Vjb25kcy5uZXh0KG1lc3NhZ2VEZWxheUluTWludXRlcyAqIDYwKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG1hcCgoKSA9PiB0cnVlKSxcbiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhclRpbWVyKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGFydFRpbWVyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHRpbWUgPSB0aGlzLmNvdW50RG93blRpbWVJblNlY29uZHMuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGlmICh0aW1lID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVyKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGltZSAtPSAxO1xuICAgICAgICAgICAgdGhpcy5jb3VudERvd25UaW1lSW5TZWNvbmRzLm5leHQodGltZSk7XG4gICAgICAgIH0sIHRoaXMuUFVMTElOR19JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJUaW1lcigpOiB2b2lkIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvcm1hdFRpbWUodGltZUluU2Vjb25kczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRpbWVJblNlY29uZHMgLyAoNjAgKiA2MCkpO1xuXG4gICAgICAgIGNvbnN0IGRpdmlzb3JfZm9yX21pbnV0ZXMgPSB0aW1lSW5TZWNvbmRzICUgKDYwICogNjApO1xuICAgICAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihkaXZpc29yX2Zvcl9taW51dGVzIC8gNjApO1xuXG4gICAgICAgIGNvbnN0IGRpdmlzb3JfZm9yX3NlY29uZHMgPSBkaXZpc29yX2Zvcl9taW51dGVzICUgNjA7XG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSBNYXRoLmNlaWwoZGl2aXNvcl9mb3Jfc2Vjb25kcyk7XG5cbiAgICAgICAgdGhpcy5tYW5hZ2VTY3JlZW5SZWFkZXJBbm5vdW5jZW1lbnQoXG4gICAgICAgICAgICB0aW1lSW5TZWNvbmRzLFxuICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICBtaW51dGVzLFxuICAgICAgICAgICAgc2Vjb25kc1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGxlZnRQYWRIb3VycyA9IHRoaXMuZGF0ZUhlbHBlci5sZWZ0UGFkKGhvdXJzLnRvU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBsZWZ0UGFkTWludXRlcyA9IHRoaXMuZGF0ZUhlbHBlci5sZWZ0UGFkKG1pbnV0ZXMudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgY29uc3QgbGVmdFBhZFNlY29uZHMgPSB0aGlzLmRhdGVIZWxwZXIubGVmdFBhZChzZWNvbmRzLnRvU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gYCR7bGVmdFBhZEhvdXJzfToke2xlZnRQYWRNaW51dGVzfToke2xlZnRQYWRTZWNvbmRzfWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhbm5vdW5jZVNyTWVzc2FnZShtc2c6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zckFubm91bmNlbWVudENsZWFyVGltZXIpO1xuICAgICAgICB0aGlzLnNyQW5ub3VuY2VtZW50c1N1YmplY3QubmV4dChtc2cpO1xuXG4gICAgICAgIHRoaXMuc3JBbm5vdW5jZW1lbnRDbGVhclRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNyQW5ub3VuY2VtZW50c1N1YmplY3QubmV4dCgnJyk7XG4gICAgICAgIH0sIHRoaXMuU1JfQU5OT1VOQ0VNRU5UX0NMRUFSX1RJTUVPVVRfSU5URVJWQUxfTVMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVhZGFibGVUaW1lckZvclNjcmVlblJlYWRlcihcbiAgICAgICAgaG91cnM6IG51bWJlcixcbiAgICAgICAgbWludXRlczogbnVtYmVyLFxuICAgICAgICBzZWNvbmRzOiBudW1iZXJcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBpZiAoIWhvdXJzICYmICFtaW51dGVzICYmICFzZWNvbmRzKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhaG91cnMgJiYgIW1pbnV0ZXMgJiYgIXNlY29uZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtob3Vyc30gaGV1cmVzYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISFtaW51dGVzICYmICFob3VycyAmJiAhc2Vjb25kcykge1xuICAgICAgICAgICAgcmV0dXJuIGAke21pbnV0ZXN9IG1pbnV0ZXNgO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIXNlY29uZHMgJiYgIW1pbnV0ZXMgJiYgIWhvdXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7c2Vjb25kc30gc2Vjb25kZXNgO1xuICAgICAgICB9XG4gICAgICAgIGlmICghIWhvdXJzICYmICEhbWludXRlcyAmJiAhIXNlY29uZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtob3Vyc30gaGV1cmVzICR7bWludXRlc30gbWludXRlcyBldCAke3NlY29uZHN9IHNlY29uZGVzYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISFob3VycyAmJiAhIW1pbnV0ZXMgJiYgIXNlY29uZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtob3Vyc30gaGV1cmVzIGV0ICR7bWludXRlc30gbWludXRlc2A7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEhaG91cnMgJiYgISFzZWNvbmRzICYmICFtaW51dGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7aG91cnN9IGhldXJlcyBldCAke3NlY29uZHN9IHNlY29uZGVzYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISFtaW51dGVzICYmICEhc2Vjb25kcyAmJiAhaG91cnMpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHttaW51dGVzfSBtaW51dGVzIGV0ICR7c2Vjb25kc30gc2Vjb25kZXNgO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYW5hZ2VTY3JlZW5SZWFkZXJBbm5vdW5jZW1lbnQoXG4gICAgICAgIHRpbWVJblNlY29uZHM6IG51bWJlcixcbiAgICAgICAgaG91cnM6IG51bWJlcixcbiAgICAgICAgbWludXRlczogbnVtYmVyLFxuICAgICAgICBzZWNvbmRzOiBudW1iZXJcbiAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgXzFfaG91ckluU2Vjb25kcyA9IDYwICogNjA7XG4gICAgICAgIGNvbnN0IF81X21pbnV0ZXNJblNlY29uZHMgPSA1ICogNjA7XG4gICAgICAgIGNvbnN0IF8xMF9taW51dGVzSW5TZWNvbmRzID0gMTAgKiA2MDtcbiAgICAgICAgY29uc3QgXzFfbWludXRlSW5TZWNvbmRzID0gNjA7XG4gICAgICAgIGNvbnN0IF8yX21pbnV0ZUluU2Vjb25kcyA9IDIgKiA2MDtcblxuICAgICAgICAvLyBXaGVuIGZpbmlzaGVkLCBkaXNwbGF5IGV4cGlyZWQgbWVzc2FnZVxuICAgICAgICBpZiAodGltZUluU2Vjb25kcyA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zckFubm91bmNlbWVudHNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXRLZXlTeW5jKFxuICAgICAgICAgICAgICAgICAgICAnZm9laG4tcGFnZS1leHBpcmF0aW9uLXRpbWVyLmV4cGlyZWQtbWVzc2FnZS5zci1vbmx5J1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXZlcnkgc2Vjb25kIGZvciB0aGUgbGFzdCAxNXNcbiAgICAgICAgaWYgKHRpbWVJblNlY29uZHMgPD0gMTUpIHtcbiAgICAgICAgICAgIHRoaXMuc3JBbm5vdW5jZW1lbnRzU3ViamVjdC5uZXh0KHRpbWVJblNlY29uZHMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXZlcnkgMzBzIHdoZW4gbGVzcyB0aGFuIDIgbWludXRlc1xuICAgICAgICBpZiAodGltZUluU2Vjb25kcyA8PSBfMl9taW51dGVJblNlY29uZHMgJiYgdGltZUluU2Vjb25kcyAlIDMwID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBtc2cgPSB0aGlzLmdldFJlYWRhYmxlVGltZXJGb3JTY3JlZW5SZWFkZXIoXG4gICAgICAgICAgICAgICAgaG91cnMsXG4gICAgICAgICAgICAgICAgbWludXRlcyxcbiAgICAgICAgICAgICAgICBzZWNvbmRzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5hbm5vdW5jZVNyTWVzc2FnZShcbiAgICAgICAgICAgICAgICB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldEtleVN5bmMoXG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1wYWdlLWV4cGlyYXRpb24tdGltZXIuY291bnQtZG93bi1tZXNzYWdlLnNyLW9ubHknLFxuICAgICAgICAgICAgICAgICAgICB7IGNvdW50RG93blZhbHVlOiBtc2cgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXZlcnkgbWludXRlIGZvciB0aGUgbGFzdCA1IG1pbnV0ZXNcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGltZUluU2Vjb25kcyA8PSBfNV9taW51dGVzSW5TZWNvbmRzICYmXG4gICAgICAgICAgICB0aW1lSW5TZWNvbmRzICUgXzFfbWludXRlSW5TZWNvbmRzID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gdGhpcy5nZXRSZWFkYWJsZVRpbWVyRm9yU2NyZWVuUmVhZGVyKFxuICAgICAgICAgICAgICAgIGhvdXJzLFxuICAgICAgICAgICAgICAgIG1pbnV0ZXMsXG4gICAgICAgICAgICAgICAgc2Vjb25kc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VTck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXRLZXlTeW5jKFxuICAgICAgICAgICAgICAgICAgICAnZm9laG4tcGFnZS1leHBpcmF0aW9uLXRpbWVyLmNvdW50LWRvd24tbWVzc2FnZS5zci1vbmx5JyxcbiAgICAgICAgICAgICAgICAgICAgeyBjb3VudERvd25WYWx1ZTogbXNnIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV2ZXJ5IDEwIG1pbnV0ZXMgd2hlbiBsZXNzIHRoYW4gYW4gaG91clxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aW1lSW5TZWNvbmRzIDwgXzFfaG91ckluU2Vjb25kcyAmJlxuICAgICAgICAgICAgdGltZUluU2Vjb25kcyAlIF8xMF9taW51dGVzSW5TZWNvbmRzID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gdGhpcy5nZXRSZWFkYWJsZVRpbWVyRm9yU2NyZWVuUmVhZGVyKFxuICAgICAgICAgICAgICAgIGhvdXJzLFxuICAgICAgICAgICAgICAgIG1pbnV0ZXMsXG4gICAgICAgICAgICAgICAgc2Vjb25kc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VTck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXRLZXlTeW5jKFxuICAgICAgICAgICAgICAgICAgICAnZm9laG4tcGFnZS1leHBpcmF0aW9uLXRpbWVyLmNvdW50LWRvd24tbWVzc2FnZS5zci1vbmx5JyxcbiAgICAgICAgICAgICAgICAgICAgeyBjb3VudERvd25WYWx1ZTogbXNnIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV2ZXJ5IGhvdXIgd2hlbiBtb3JlIHRoYW4gYW4gaG91clxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aW1lSW5TZWNvbmRzID49IF8xX2hvdXJJblNlY29uZHMgJiZcbiAgICAgICAgICAgIHRpbWVJblNlY29uZHMgJSBfMV9ob3VySW5TZWNvbmRzID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgbXNnID0gdGhpcy5nZXRSZWFkYWJsZVRpbWVyRm9yU2NyZWVuUmVhZGVyKFxuICAgICAgICAgICAgICAgIGhvdXJzLFxuICAgICAgICAgICAgICAgIG1pbnV0ZXMsXG4gICAgICAgICAgICAgICAgc2Vjb25kc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3VuY2VTck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5kaWN0aW9uYXJ5U2VydmljZS5nZXRLZXlTeW5jKFxuICAgICAgICAgICAgICAgICAgICAnZm9laG4tcGFnZS1leHBpcmF0aW9uLXRpbWVyLmNvdW50LWRvd24tbWVzc2FnZS5zci1vbmx5JyxcbiAgICAgICAgICAgICAgICAgICAgeyBjb3VudERvd25WYWx1ZTogbXNnIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdlxuICAgICpuZ0lmPVwiYXBwbGljYXRpb25JbmZvUmV0cmlldmVkIHwgYXN5bmNcIlxuICAgIGNsYXNzPVwic3RpY2t5LXRvcCBhbGVydCB0ZXh0LWNlbnRlciBteS0wXCJcbiAgICBbY2xhc3MuYWxlcnQtd2FybmluZ109XCIoc2Vzc2lvbkV4cGlyZWQgfCBhc3luYykgPT09IGZhbHNlXCJcbiAgICBbY2xhc3MuYWxlcnQtZGFuZ2VyXT1cIihzZXNzaW9uRXhwaXJlZCB8IGFzeW5jKSA9PT0gdHJ1ZVwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiKHNlc3Npb25FeHBpcmVkIHwgYXN5bmMpID09PSBmYWxzZVwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAnZm9laG4tcGFnZS1leHBpcmF0aW9uLXRpbWVyLmNvdW50LWRvd24tbWVzc2FnZSdcbiAgICAgICAgICAgICAgICB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICAgICAgICAgIDogeyBjb3VudERvd25WYWx1ZTogY291bnREb3duVGltZVRvRGlzcGxheSB8IGFzeW5jIH1cbiAgICAgICAgXCJcbiAgICA+PC9kaXY+XG4gICAgPGRpdlxuICAgICAgICAqbmdJZj1cIihzZXNzaW9uRXhwaXJlZCB8IGFzeW5jKSA9PT0gdHJ1ZVwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwiXG4gICAgICAgICAgICAnZm9laG4tcGFnZS1leHBpcmF0aW9uLXRpbWVyLmV4cGlyZWQtbWVzc2FnZScgfCBmcm9tRGljdGlvbmFyeVxuICAgICAgICBcIlxuICAgID48L2Rpdj5cbjwvZGl2PlxuXG48cCBjbGFzcz1cInNyLW9ubHlcIiBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIiBhcmlhLWF0b21pYz1cInRydWVcIj5cbiAgICB7eyBzckFubm91bmNlbWVudHMgfCBhc3luYyB9fVxuPC9wPlxuIl19