@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.
- package/fesm2022/yuuvis-client-framework-actions.mjs +16 -16
- package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-app-bar.mjs +3 -3
- package/fesm2022/yuuvis-client-framework-app-bar.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-autocomplete.mjs +7 -7
- package/fesm2022/yuuvis-client-framework-autocomplete.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-clipboard.mjs +3 -3
- package/fesm2022/yuuvis-client-framework-clipboard.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-common.mjs +76 -76
- package/fesm2022/yuuvis-client-framework-common.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-datepicker.mjs +31 -31
- package/fesm2022/yuuvis-client-framework-datepicker.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-forms.mjs +48 -48
- package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-icons.mjs +9 -9
- package/fesm2022/yuuvis-client-framework-icons.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-list.mjs +29 -22
- package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-master-details.mjs +7 -7
- package/fesm2022/yuuvis-client-framework-master-details.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-metadata-form-defaults.mjs +7 -7
- package/fesm2022/yuuvis-client-framework-metadata-form-defaults.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-metadata-form.mjs +15 -15
- package/fesm2022/yuuvis-client-framework-metadata-form.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-details.mjs +28 -28
- package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-flavor.mjs +18 -18
- package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-form.mjs +31 -31
- package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-preview.mjs +13 -13
- package/fesm2022/yuuvis-client-framework-object-preview.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-relationship.mjs +29 -29
- package/fesm2022/yuuvis-client-framework-object-relationship.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-summary.mjs +13 -13
- package/fesm2022/yuuvis-client-framework-object-summary.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-versions.mjs +7 -7
- package/fesm2022/yuuvis-client-framework-object-versions.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-overflow-hidden.mjs +7 -7
- package/fesm2022/yuuvis-client-framework-overflow-hidden.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-overflow-menu.mjs +7 -7
- package/fesm2022/yuuvis-client-framework-overflow-menu.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-pagination.mjs +3 -3
- package/fesm2022/yuuvis-client-framework-pagination.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-popout.mjs +10 -10
- package/fesm2022/yuuvis-client-framework-popout.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-query-list.mjs +11 -8
- package/fesm2022/yuuvis-client-framework-query-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-renderer.mjs +39 -39
- package/fesm2022/yuuvis-client-framework-renderer.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-sequence-list.mjs +3 -3
- package/fesm2022/yuuvis-client-framework-sequence-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-simple-search.mjs +3 -3
- package/fesm2022/yuuvis-client-framework-simple-search.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-sort.mjs +3 -3
- package/fesm2022/yuuvis-client-framework-sort.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-split-view.mjs +13 -13
- package/fesm2022/yuuvis-client-framework-split-view.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-tile-list.mjs +109 -99
- package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-tree.mjs +9 -9
- package/fesm2022/yuuvis-client-framework-tree.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-upload-progress.mjs +10 -10
- package/fesm2022/yuuvis-client-framework-upload-progress.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-widget-grid.mjs +28 -28
- package/fesm2022/yuuvis-client-framework-widget-grid.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework.mjs +100 -61
- package/fesm2022/yuuvis-client-framework.mjs.map +1 -1
- package/lib/assets/i18n/de.json +1 -1
- package/lib/assets/i18n/en.json +21 -21
- package/lib/services/halo-utility/halo-utility.service.d.ts +18 -3
- package/lib/services/session/session.service.d.ts +1 -1
- package/list/lib/list.component.d.ts +8 -3
- package/package.json +4 -4
- package/query-list/lib/query-list.component.d.ts +2 -0
- 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
|
-
|
|
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') ||
|
|
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 = (
|
|
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(
|
|
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 = (
|
|
481
|
-
const 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
|
-
|
|
493
|
+
container?.hasAttribute('halo-container-skip') ||
|
|
489
494
|
!this.#utility.matchesFocusVisible(target, this.#lastInteractionWasKeyboard)) {
|
|
490
|
-
|
|
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 = (
|
|
498
|
-
if (
|
|
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.
|
|
505
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
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.
|
|
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
|
-
*
|
|
675
|
+
* Calculates the visible portion of an element considering overflow clipping from parent containers.
|
|
669
676
|
*
|
|
670
|
-
* Traverses up the DOM tree
|
|
671
|
-
*
|
|
672
|
-
*
|
|
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
|
-
*
|
|
675
|
-
*
|
|
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
|
|
678
|
-
* @
|
|
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
|
-
|
|
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
|
|
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
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
// If no intersection or intersection is too small
|
|
700
|
-
if (
|
|
701
|
-
return
|
|
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
|
|
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 (
|
|
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
|
-
* -
|
|
881
|
-
* -
|
|
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
|
|
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(
|
|
894
|
-
const top = Math.floor(
|
|
895
|
-
const width = Math.ceil(
|
|
896
|
-
const height = Math.ceil(
|
|
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.
|
|
905
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
939
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
966
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
1306
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.
|
|
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.
|
|
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.
|
|
1435
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.
|
|
1436
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.
|
|
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.
|
|
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],
|