@yuuvis/client-framework 2.12.4 → 2.13.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 (76) hide show
  1. package/fesm2022/yuuvis-client-framework-actions.mjs +16 -16
  2. package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -1
  3. package/fesm2022/yuuvis-client-framework-app-bar.mjs +3 -3
  4. package/fesm2022/yuuvis-client-framework-app-bar.mjs.map +1 -1
  5. package/fesm2022/yuuvis-client-framework-autocomplete.mjs +7 -7
  6. package/fesm2022/yuuvis-client-framework-autocomplete.mjs.map +1 -1
  7. package/fesm2022/yuuvis-client-framework-clipboard.mjs +3 -3
  8. package/fesm2022/yuuvis-client-framework-clipboard.mjs.map +1 -1
  9. package/fesm2022/yuuvis-client-framework-common.mjs +76 -76
  10. package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -1
  11. package/fesm2022/yuuvis-client-framework-datepicker.mjs +31 -31
  12. package/fesm2022/yuuvis-client-framework-datepicker.mjs.map +1 -1
  13. package/fesm2022/yuuvis-client-framework-forms.mjs +48 -48
  14. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
  15. package/fesm2022/yuuvis-client-framework-icons.mjs +9 -9
  16. package/fesm2022/yuuvis-client-framework-icons.mjs.map +1 -1
  17. package/fesm2022/yuuvis-client-framework-list.mjs +29 -22
  18. package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -1
  19. package/fesm2022/yuuvis-client-framework-master-details.mjs +7 -7
  20. package/fesm2022/yuuvis-client-framework-master-details.mjs.map +1 -1
  21. package/fesm2022/yuuvis-client-framework-metadata-form-defaults.mjs +7 -7
  22. package/fesm2022/yuuvis-client-framework-metadata-form-defaults.mjs.map +1 -1
  23. package/fesm2022/yuuvis-client-framework-metadata-form.mjs +15 -15
  24. package/fesm2022/yuuvis-client-framework-metadata-form.mjs.map +1 -1
  25. package/fesm2022/yuuvis-client-framework-object-details.mjs +28 -28
  26. package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -1
  27. package/fesm2022/yuuvis-client-framework-object-flavor.mjs +18 -18
  28. package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
  29. package/fesm2022/yuuvis-client-framework-object-form.mjs +31 -31
  30. package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -1
  31. package/fesm2022/yuuvis-client-framework-object-preview.mjs +13 -13
  32. package/fesm2022/yuuvis-client-framework-object-preview.mjs.map +1 -1
  33. package/fesm2022/yuuvis-client-framework-object-relationship.mjs +29 -29
  34. package/fesm2022/yuuvis-client-framework-object-relationship.mjs.map +1 -1
  35. package/fesm2022/yuuvis-client-framework-object-summary.mjs +13 -13
  36. package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -1
  37. package/fesm2022/yuuvis-client-framework-object-versions.mjs +7 -7
  38. package/fesm2022/yuuvis-client-framework-object-versions.mjs.map +1 -1
  39. package/fesm2022/yuuvis-client-framework-overflow-hidden.mjs +7 -7
  40. package/fesm2022/yuuvis-client-framework-overflow-hidden.mjs.map +1 -1
  41. package/fesm2022/yuuvis-client-framework-overflow-menu.mjs +7 -7
  42. package/fesm2022/yuuvis-client-framework-overflow-menu.mjs.map +1 -1
  43. package/fesm2022/yuuvis-client-framework-pagination.mjs +3 -3
  44. package/fesm2022/yuuvis-client-framework-pagination.mjs.map +1 -1
  45. package/fesm2022/yuuvis-client-framework-popout.mjs +10 -10
  46. package/fesm2022/yuuvis-client-framework-popout.mjs.map +1 -1
  47. package/fesm2022/yuuvis-client-framework-query-list.mjs +11 -8
  48. package/fesm2022/yuuvis-client-framework-query-list.mjs.map +1 -1
  49. package/fesm2022/yuuvis-client-framework-renderer.mjs +39 -39
  50. package/fesm2022/yuuvis-client-framework-renderer.mjs.map +1 -1
  51. package/fesm2022/yuuvis-client-framework-sequence-list.mjs +3 -3
  52. package/fesm2022/yuuvis-client-framework-sequence-list.mjs.map +1 -1
  53. package/fesm2022/yuuvis-client-framework-simple-search.mjs +3 -3
  54. package/fesm2022/yuuvis-client-framework-simple-search.mjs.map +1 -1
  55. package/fesm2022/yuuvis-client-framework-sort.mjs +3 -3
  56. package/fesm2022/yuuvis-client-framework-sort.mjs.map +1 -1
  57. package/fesm2022/yuuvis-client-framework-split-view.mjs +13 -13
  58. package/fesm2022/yuuvis-client-framework-split-view.mjs.map +1 -1
  59. package/fesm2022/yuuvis-client-framework-tile-list.mjs +109 -99
  60. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
  61. package/fesm2022/yuuvis-client-framework-tree.mjs +9 -9
  62. package/fesm2022/yuuvis-client-framework-tree.mjs.map +1 -1
  63. package/fesm2022/yuuvis-client-framework-upload-progress.mjs +10 -10
  64. package/fesm2022/yuuvis-client-framework-upload-progress.mjs.map +1 -1
  65. package/fesm2022/yuuvis-client-framework-widget-grid.mjs +28 -28
  66. package/fesm2022/yuuvis-client-framework-widget-grid.mjs.map +1 -1
  67. package/fesm2022/yuuvis-client-framework.mjs +100 -61
  68. package/fesm2022/yuuvis-client-framework.mjs.map +1 -1
  69. package/lib/assets/i18n/de.json +1 -1
  70. package/lib/assets/i18n/en.json +21 -21
  71. package/lib/services/halo-utility/halo-utility.service.d.ts +18 -3
  72. package/lib/services/session/session.service.d.ts +1 -1
  73. package/list/lib/list.component.d.ts +8 -3
  74. package/package.json +4 -4
  75. package/query-list/lib/query-list.component.d.ts +2 -0
  76. package/tile-list/lib/tile-list/tile-list.component.d.ts +12 -10
@@ -410,7 +410,9 @@ class HaloFocusService {
410
410
  //#region Rendering
411
411
  #updateHaloRect = () => {
412
412
  if (!this.#currentElement || !this.#haloElement || !document.contains(this.#currentElement)) {
413
- this.#haloElement && (this.#haloElement.style.opacity = '0');
413
+ if (this.#haloElement) {
414
+ this.#haloElement.style.opacity = '0';
415
+ }
414
416
  this.#currentElement = null;
415
417
  return;
416
418
  }
@@ -439,7 +441,10 @@ class HaloFocusService {
439
441
  while (parent && parent !== document.body) {
440
442
  const style = getComputedStyle(parent);
441
443
  const overflow = style.overflow + style.overflowX + style.overflowY;
442
- if (overflow.includes('hidden') || overflow.includes('clip') || overflow.includes('auto') || overflow.includes('scroll')) {
444
+ if (overflow.includes('hidden') ||
445
+ overflow.includes('clip') ||
446
+ overflow.includes('auto') ||
447
+ overflow.includes('scroll')) {
443
448
  this.#resizeObserver.observe(parent);
444
449
  }
445
450
  parent = parent.parentElement;
@@ -462,10 +467,10 @@ class HaloFocusService {
462
467
  }
463
468
  //#endregion
464
469
  //#region Event handlers
465
- #onKeydown = (e) => {
470
+ #onKeydown = (event) => {
466
471
  this.#lastInteractionWasKeyboard = true;
467
472
  // Track arrow keys and other navigation keys that might move focused element
468
- if (this.#currentElement && haloFocusNavigationKeys.includes(e.key)) {
473
+ if (this.#currentElement && haloFocusNavigationKeys.includes(event.key)) {
469
474
  this.#scheduleUpdate();
470
475
  }
471
476
  };
@@ -477,34 +482,36 @@ class HaloFocusService {
477
482
  this.#stopTracking();
478
483
  }
479
484
  };
480
- #onFocus = (e) => {
481
- const target = e.target;
485
+ #onFocus = (focusEvent) => {
486
+ const target = focusEvent.target;
482
487
  if (!this.#utility.isFocusable(target))
483
488
  return;
484
489
  const container = this.#utility.getHaloContainer(target);
485
490
  // Check all skip conditions
486
491
  if (target.hasAttribute('halo-skip') ||
487
492
  this.#utility.shouldSkipElementInMatFormField(target) ||
488
- (container && container.hasAttribute('halo-container-skip')) ||
493
+ container?.hasAttribute('halo-container-skip') ||
489
494
  !this.#utility.matchesFocusVisible(target, this.#lastInteractionWasKeyboard)) {
490
- this.#haloElement && (this.#haloElement.style.opacity = '0');
495
+ if (this.#haloElement) {
496
+ this.#haloElement.style.opacity = '0';
497
+ }
491
498
  this.#currentElement = null;
492
499
  return;
493
500
  }
494
501
  this.#stopTracking();
495
502
  this.#startTracking(target);
496
503
  };
497
- #onBlur = (e) => {
498
- if (e.target === this.#currentElement && this.#haloElement) {
504
+ #onBlur = (focusEvent) => {
505
+ if (focusEvent.target === this.#currentElement && this.#haloElement) {
499
506
  this.#haloElement.style.opacity = '0';
500
507
  this.#currentElement = null;
501
508
  this.#stopTracking();
502
509
  }
503
510
  };
504
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: HaloFocusService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
505
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: HaloFocusService, providedIn: 'root' }); }
511
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: HaloFocusService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
512
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: HaloFocusService, providedIn: 'root' }); }
506
513
  }
507
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: HaloFocusService, decorators: [{
514
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: HaloFocusService, decorators: [{
508
515
  type: Injectable,
509
516
  args: [{
510
517
  providedIn: 'root'
@@ -665,45 +672,71 @@ class HaloUtilityService {
665
672
  return this.isParentVisible(element, rect);
666
673
  }
667
674
  /**
668
- * Recursively checks if all parent elements are visible and not clipping the target element.
675
+ * Calculates the visible portion of an element considering overflow clipping from parent containers.
669
676
  *
670
- * Traverses up the DOM tree from the element to document.body, checking each parent for:
671
- * - Hidden state (display: none, visibility: hidden, opacity: 0)
672
- * - Overflow clipping (overflow: hidden/clip) that completely hides the element
677
+ * Traverses up the DOM tree checking for parents with overflow clipping (hidden/clip/auto/scroll).
678
+ * For each clipping parent, calculates the intersection between the element's current visible area
679
+ * and the parent's boundaries, progressively clipping the visible rectangle.
673
680
  *
674
- * If any parent has overflow clipping, calculates the visible intersection area.
675
- * Returns false if element is completely clipped (no visible area).
681
+ * This is essential for showing halo focus only around the visible portion of elements that are
682
+ * partially scrolled out of view.
676
683
  *
677
- * @param element - The element whose parents should be checked
678
- * @param rect - The bounding rectangle of the element
679
- * @returns true if element has visible area within all parent containers, false otherwise
684
+ * @param element - The element to calculate visible rectangle for
685
+ * @returns The visible rectangle, or null if element is completely hidden
680
686
  */
681
- isParentVisible(element, rect) {
687
+ getVisibleRect(element) {
688
+ let rect = element.getBoundingClientRect();
689
+ let visibleRect = {
690
+ left: rect.left,
691
+ top: rect.top,
692
+ right: rect.right,
693
+ bottom: rect.bottom,
694
+ width: rect.width,
695
+ height: rect.height
696
+ };
682
697
  let parent = element.parentElement;
683
698
  while (parent && parent !== document.body) {
684
699
  const parentStyle = getComputedStyle(parent);
685
700
  // Check if parent is hidden
686
701
  if (parentStyle.display === 'none' || parentStyle.visibility === 'hidden' || parseFloat(parentStyle.opacity) === 0) {
687
- return false;
702
+ return null;
688
703
  }
689
704
  const parentOverflow = parentStyle.overflow + parentStyle.overflowX + parentStyle.overflowY;
690
- if (parentOverflow.includes('hidden') || parentOverflow.includes('clip')) {
705
+ if (parentOverflow.includes('hidden') || parentOverflow.includes('clip') || parentOverflow.includes('auto') || parentOverflow.includes('scroll')) {
691
706
  const parentRect = parent.getBoundingClientRect();
692
- // Calculate intersection - if there's no visible area, element is hidden
693
- const visibleRight = Math.min(rect.right, parentRect.right);
694
- const visibleLeft = Math.max(rect.left, parentRect.left);
695
- const visibleBottom = Math.min(rect.bottom, parentRect.bottom);
696
- const visibleTop = Math.max(rect.top, parentRect.top);
697
- const visibleWidth = visibleRight - visibleLeft;
698
- const visibleHeight = visibleBottom - visibleTop;
699
- // If no intersection or intersection is too small (less than 1px), element is not visible
700
- if (visibleWidth <= 0 || visibleHeight <= 0) {
701
- return false;
707
+ // Calculate intersection with this parent
708
+ visibleRect.right = Math.min(visibleRect.right, parentRect.right);
709
+ visibleRect.left = Math.max(visibleRect.left, parentRect.left);
710
+ visibleRect.bottom = Math.min(visibleRect.bottom, parentRect.bottom);
711
+ visibleRect.top = Math.max(visibleRect.top, parentRect.top);
712
+ visibleRect.width = visibleRect.right - visibleRect.left;
713
+ visibleRect.height = visibleRect.bottom - visibleRect.top;
714
+ // If no intersection or intersection is too small, element is completely hidden
715
+ if (visibleRect.width <= 0 || visibleRect.height <= 0) {
716
+ return null;
702
717
  }
703
718
  }
704
719
  parent = parent.parentElement;
705
720
  }
706
- return true;
721
+ return visibleRect;
722
+ }
723
+ /**
724
+ * Recursively checks if all parent elements are visible and not clipping the target element.
725
+ *
726
+ * Traverses up the DOM tree from the element to document.body, checking each parent for:
727
+ * - Hidden state (display: none, visibility: hidden, opacity: 0)
728
+ * - Overflow clipping (overflow: hidden/clip) that completely hides the element
729
+ *
730
+ * If any parent has overflow clipping, calculates the visible intersection area.
731
+ * Returns false if element is completely clipped (no visible area).
732
+ *
733
+ * @param element - The element whose parents should be checked
734
+ * @param rect - The bounding rectangle of the element
735
+ * @returns true if element has visible area within all parent containers, false otherwise
736
+ */
737
+ isParentVisible(element, rect) {
738
+ const visibleRect = this.getVisibleRect(element);
739
+ return visibleRect !== null;
707
740
  }
708
741
  //#endregion
709
742
  // #region Utilities
@@ -872,13 +905,14 @@ class HaloUtilityService {
872
905
  * Positions and sizes the halo element to surround the focused element.
873
906
  *
874
907
  * Calculates halo dimensions and position based on:
875
- * - Element's bounding rectangle (viewport-relative position)
908
+ * - Element's visible bounding rectangle (considering overflow clipping)
876
909
  * - Calculated offset from getTargetOffset() (custom or default)
877
910
  * - Element's border-radius for matching rounded corners
878
911
  *
879
912
  * **Calculation Details:**
880
- * - Position: Element's top/left minus offset (for outside positioning)
881
- * - Size: Element's width/height plus offset (to extend on all sides)
913
+ * - Uses getVisibleRect to get only the visible portion of the element
914
+ * - Position: Visible rect's top/left minus offset (for outside positioning)
915
+ * - Size: Visible rect's width/height plus 2× offset (to extend on all sides)
882
916
  * - Border radius: Inherited from focused element's computed style
883
917
  *
884
918
  * Uses Math.floor for position and Math.ceil for dimensions to prevent
@@ -888,12 +922,17 @@ class HaloUtilityService {
888
922
  * @param haloElement - The halo DIV element to position and size
889
923
  */
890
924
  setHaloElementSize(currentElement, haloElement) {
891
- const rect = currentElement.getBoundingClientRect();
925
+ const visibleRect = this.getVisibleRect(currentElement);
926
+ // If element is not visible, hide the halo
927
+ if (!visibleRect) {
928
+ haloElement.style.opacity = '0';
929
+ return;
930
+ }
892
931
  const offset = this.getTargetOffset(currentElement);
893
- const left = Math.floor(rect.left - offset);
894
- const top = Math.floor(rect.top - offset);
895
- const width = Math.ceil(rect.width + offset * 2);
896
- const height = Math.ceil(rect.height + offset * 2);
932
+ const left = Math.floor(visibleRect.left - offset);
933
+ const top = Math.floor(visibleRect.top - offset);
934
+ const width = Math.ceil(visibleRect.width + offset * 2);
935
+ const height = Math.ceil(visibleRect.height + offset * 2);
897
936
  const cs = getComputedStyle(currentElement);
898
937
  haloElement.style.left = `${left}px`;
899
938
  haloElement.style.top = `${top}px`;
@@ -901,10 +940,10 @@ class HaloUtilityService {
901
940
  haloElement.style.height = `${height}px`;
902
941
  haloElement.style.borderRadius = cs.borderRadius || '8px';
903
942
  }
904
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: HaloUtilityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
905
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: HaloUtilityService }); }
943
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: HaloUtilityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
944
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: HaloUtilityService }); }
906
945
  }
907
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: HaloUtilityService, decorators: [{
946
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: HaloUtilityService, decorators: [{
908
947
  type: Injectable
909
948
  }] });
910
949
 
@@ -935,10 +974,10 @@ class SnackBarService {
935
974
  panelClass: ['yuv-snack-bar', 'level-' + options.level]
936
975
  });
937
976
  }
938
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SnackBarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
939
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SnackBarService, providedIn: 'root' }); }
977
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: SnackBarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
978
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: SnackBarService, providedIn: 'root' }); }
940
979
  }
941
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SnackBarService, decorators: [{
980
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: SnackBarService, decorators: [{
942
981
  type: Injectable,
943
982
  args: [{
944
983
  providedIn: 'root'
@@ -962,8 +1001,8 @@ class SnackBarComponent {
962
1001
  this.#snackBarRef.dismiss();
963
1002
  }
964
1003
  }
965
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SnackBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
966
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: SnackBarComponent, isStandalone: true, selector: "yuv-snack-bar-component", host: { properties: { "class.info": "level() === 'info'", "class.success": "level() === 'success'", "class.warning": "level() === 'warning'", "class.danger": "level() === 'danger'" } }, ngImport: i0, template: `
1004
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: SnackBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1005
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.20", type: SnackBarComponent, isStandalone: true, selector: "yuv-snack-bar-component", host: { properties: { "class.info": "level() === 'info'", "class.success": "level() === 'success'", "class.warning": "level() === 'warning'", "class.danger": "level() === 'danger'" } }, ngImport: i0, template: `
967
1006
  <span matSnackBarLabel (click)="dismiss()"> {{ message() }} </span>
968
1007
  @let a = action();
969
1008
  @if (a) {
@@ -973,7 +1012,7 @@ class SnackBarComponent {
973
1012
  }
974
1013
  `, isInline: true, styles: [":host{display:flex}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatSnackBarLabel, selector: "[matSnackBarLabel]" }, { kind: "directive", type: MatSnackBarActions, selector: "[matSnackBarActions]" }, { kind: "directive", type: MatSnackBarAction, selector: "[matSnackBarAction]" }] }); }
975
1014
  }
976
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SnackBarComponent, decorators: [{
1015
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: SnackBarComponent, decorators: [{
977
1016
  type: Component,
978
1017
  args: [{ selector: 'yuv-snack-bar-component', template: `
979
1018
  <span matSnackBarLabel (click)="dismiss()"> {{ message() }} </span>
@@ -998,7 +1037,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
998
1037
  * Key behaviors
999
1038
  * - Persists `expiresAt` in AppCacheService so multiple tabs share the same deadline
1000
1039
  * - Automatically listens to BackendService HTTP activity (debounced) to extend sessions
1001
- * - Extends backend session by calling `/api-web/api/idm/whoami` endpoint (skipped when triggered by HTTP activity)
1040
+ * - Extends backend session by calling `/api-web/api/idm/whoami` endpoint` (skipped when triggered by HTTP activity)
1002
1041
  * - User activity (mouse, keyboard, scroll) inside a defined window will auto-extend the session
1003
1042
  * - Displays a snack popup shortly before expiry; user can extend from the popup
1004
1043
  * - Broadcasts `SessionExtended` / `SessionLogout` to keep tabs in sync
@@ -1302,10 +1341,10 @@ class SessionService {
1302
1341
  this.#logoutTimer$?.unsubscribe();
1303
1342
  this.#httpActivitySubscription$?.unsubscribe();
1304
1343
  }
1305
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SessionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1306
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SessionService, providedIn: 'root' }); }
1344
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: SessionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1345
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: SessionService, providedIn: 'root' }); }
1307
1346
  }
1308
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: SessionService, decorators: [{
1347
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: SessionService, decorators: [{
1309
1348
  type: Injectable,
1310
1349
  args: [{ providedIn: 'root' }]
1311
1350
  }] });
@@ -1431,11 +1470,11 @@ function provideSession(sessionDuration) {
1431
1470
  }
1432
1471
 
1433
1472
  class YuuvisClientFrameworkModule {
1434
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: YuuvisClientFrameworkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1435
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.15", ngImport: i0, type: YuuvisClientFrameworkModule, imports: [CommonModule] }); }
1436
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: YuuvisClientFrameworkModule, imports: [CommonModule] }); }
1473
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: YuuvisClientFrameworkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1474
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.20", ngImport: i0, type: YuuvisClientFrameworkModule, imports: [CommonModule] }); }
1475
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: YuuvisClientFrameworkModule, imports: [CommonModule] }); }
1437
1476
  }
1438
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: YuuvisClientFrameworkModule, decorators: [{
1477
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.20", ngImport: i0, type: YuuvisClientFrameworkModule, decorators: [{
1439
1478
  type: NgModule,
1440
1479
  args: [{
1441
1480
  imports: [CommonModule],