carriera-intern-components 1.1.51 → 1.1.52
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.
|
@@ -12,6 +12,11 @@ export declare class StickyScrollbarComponent implements AfterViewInit, OnChange
|
|
|
12
12
|
* Hide the scrollbar track completely
|
|
13
13
|
*/
|
|
14
14
|
hideTrack: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Keep scrollbar fixed at bottom of viewport even when table scrolls out of view
|
|
17
|
+
* @default false
|
|
18
|
+
*/
|
|
19
|
+
alwaysVisible: boolean;
|
|
15
20
|
/**
|
|
16
21
|
* Offset for the sticky position from the bottom (in pixels)
|
|
17
22
|
* @default 0
|
|
@@ -28,65 +33,31 @@ export declare class StickyScrollbarComponent implements AfterViewInit, OnChange
|
|
|
28
33
|
private readonly renderer;
|
|
29
34
|
private readonly destroyRef;
|
|
30
35
|
isDragging: boolean;
|
|
36
|
+
isContainerInView: import("@angular/core").WritableSignal<boolean>;
|
|
31
37
|
private dragStartX;
|
|
32
38
|
private scrollStartLeft;
|
|
33
39
|
private isSettingScrollPosition;
|
|
34
40
|
private currentScrollState?;
|
|
35
41
|
private setPositionTimeout?;
|
|
36
|
-
private
|
|
37
|
-
private dragEnd$;
|
|
42
|
+
private intersectionObserver?;
|
|
38
43
|
ngOnChanges(changes: SimpleChanges): void;
|
|
39
44
|
ngAfterViewInit(): void;
|
|
40
|
-
/**
|
|
41
|
-
* Applies the scroll position from input (programmatically)
|
|
42
|
-
*/
|
|
43
45
|
private applyScrollPosition;
|
|
44
|
-
/**
|
|
45
|
-
* Updates scrollbar thumb size and position based on content
|
|
46
|
-
*/
|
|
47
46
|
private updateScrollbar;
|
|
48
|
-
/**
|
|
49
|
-
* Observes container resize to update scrollbar
|
|
50
|
-
*/
|
|
51
47
|
private setupResizeObserver;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
*/
|
|
48
|
+
private setupAlwaysVisibleTracking;
|
|
49
|
+
private updateFixedTrackPosition;
|
|
55
50
|
private updateScrollState;
|
|
56
|
-
/**
|
|
57
|
-
* Calculates the scroll state based on current scroll position
|
|
58
|
-
*/
|
|
59
51
|
private calculateScrollState;
|
|
60
|
-
/**
|
|
61
|
-
* Handles scroll event on the container
|
|
62
|
-
*/
|
|
63
52
|
onScroll(): void;
|
|
64
|
-
/**
|
|
65
|
-
* Handles mouse down on scrollbar thumb
|
|
66
|
-
*/
|
|
67
53
|
onThumbMouseDown(event: MouseEvent): void;
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
private setupDragListeners;
|
|
72
|
-
/**
|
|
73
|
-
* Handles thumb dragging
|
|
74
|
-
*/
|
|
54
|
+
onWindowMouseMove(event: MouseEvent): void;
|
|
55
|
+
onWindowMouseUp(): void;
|
|
56
|
+
onWindowMouseLeave(): void;
|
|
75
57
|
private onThumbDrag;
|
|
76
|
-
/**
|
|
77
|
-
* Handles mouse up to end dragging
|
|
78
|
-
*/
|
|
79
58
|
onThumbMouseUp(): void;
|
|
80
|
-
/**
|
|
81
|
-
* Public method to manually refresh the scrollbar
|
|
82
|
-
* Useful when content or container dimensions change programmatically
|
|
83
|
-
*/
|
|
84
59
|
refresh(): void;
|
|
85
|
-
/**
|
|
86
|
-
* Public method to scroll to the end of the container
|
|
87
|
-
* Useful when resizing the last element or when you want to ensure the end is visible
|
|
88
|
-
*/
|
|
89
60
|
scrollToEnd(): void;
|
|
90
61
|
static ɵfac: i0.ɵɵFactoryDeclaration<StickyScrollbarComponent, never>;
|
|
91
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<StickyScrollbarComponent, "ca-sticky-scrollbar", never, { "scrollPosition": { "alias": "scrollPosition"; "required": false; }; "hideTrack": { "alias": "hideTrack"; "required": false; }; "stickyOffset": { "alias": "stickyOffset"; "required": false; }; }, { "scrollPositionChange": "scrollPositionChange"; "scrollStateChange": "scrollStateChange"; }, never, ["*"], true, never>;
|
|
62
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<StickyScrollbarComponent, "ca-sticky-scrollbar", never, { "scrollPosition": { "alias": "scrollPosition"; "required": false; }; "hideTrack": { "alias": "hideTrack"; "required": false; }; "alwaysVisible": { "alias": "alwaysVisible"; "required": false; }; "stickyOffset": { "alias": "stickyOffset"; "required": false; }; }, { "scrollPositionChange": "scrollPositionChange"; "scrollStateChange": "scrollStateChange"; }, never, ["*"], true, never>;
|
|
92
63
|
}
|
|
@@ -12,12 +12,11 @@ import { ImageCropperComponent } from 'ngx-image-cropper';
|
|
|
12
12
|
import * as pdfjsLib from 'pdfjs-dist';
|
|
13
13
|
import * as i1$1 from '@angular/platform-browser';
|
|
14
14
|
import moment from 'moment';
|
|
15
|
-
import { Subject, takeUntil, distinctUntilChanged as distinctUntilChanged$1, tap, filter, debounceTime, switchMap, of, catchError
|
|
15
|
+
import { Subject, takeUntil, distinctUntilChanged as distinctUntilChanged$1, tap, filter, debounceTime, switchMap, of, catchError } from 'rxjs';
|
|
16
16
|
import { distinctUntilChanged, takeUntil as takeUntil$1 } from 'rxjs/operators';
|
|
17
17
|
import * as i3 from '@angular/cdk/scrolling';
|
|
18
18
|
import { ScrollingModule, VIRTUAL_SCROLL_STRATEGY } from '@angular/cdk/scrolling';
|
|
19
19
|
import * as i1$3 from '@angular/cdk/clipboard';
|
|
20
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
21
20
|
|
|
22
21
|
/**
|
|
23
22
|
* Creates a validator that ignores validation rules when the control is autofilled.
|
|
@@ -8832,7 +8831,6 @@ var eScrollState;
|
|
|
8832
8831
|
eScrollState["NOT_NEEDED"] = "not_needed";
|
|
8833
8832
|
})(eScrollState || (eScrollState = {}));
|
|
8834
8833
|
|
|
8835
|
-
// Angular Core
|
|
8836
8834
|
class StickyScrollbarComponent {
|
|
8837
8835
|
scrollContainer;
|
|
8838
8836
|
scrollThumb;
|
|
@@ -8844,6 +8842,11 @@ class StickyScrollbarComponent {
|
|
|
8844
8842
|
* Hide the scrollbar track completely
|
|
8845
8843
|
*/
|
|
8846
8844
|
hideTrack = false;
|
|
8845
|
+
/**
|
|
8846
|
+
* Keep scrollbar fixed at bottom of viewport even when table scrolls out of view
|
|
8847
|
+
* @default false
|
|
8848
|
+
*/
|
|
8849
|
+
alwaysVisible = false;
|
|
8847
8850
|
/**
|
|
8848
8851
|
* Offset for the sticky position from the bottom (in pixels)
|
|
8849
8852
|
* @default 0
|
|
@@ -8860,40 +8863,47 @@ class StickyScrollbarComponent {
|
|
|
8860
8863
|
renderer = inject(Renderer2);
|
|
8861
8864
|
destroyRef = inject(DestroyRef);
|
|
8862
8865
|
isDragging = false;
|
|
8866
|
+
isContainerInView = signal(true);
|
|
8863
8867
|
dragStartX = 0;
|
|
8864
8868
|
scrollStartLeft = 0;
|
|
8865
8869
|
isSettingScrollPosition = false;
|
|
8866
8870
|
currentScrollState;
|
|
8867
8871
|
setPositionTimeout;
|
|
8868
|
-
|
|
8869
|
-
dragEnd$ = new Subject();
|
|
8872
|
+
intersectionObserver;
|
|
8870
8873
|
ngOnChanges(changes) {
|
|
8871
8874
|
if (changes['scrollPosition'] && !changes['scrollPosition'].firstChange) {
|
|
8872
8875
|
this.applyScrollPosition();
|
|
8873
8876
|
}
|
|
8877
|
+
if (changes['alwaysVisible']?.currentValue &&
|
|
8878
|
+
!changes['alwaysVisible'].firstChange) {
|
|
8879
|
+
this.setupAlwaysVisibleTracking();
|
|
8880
|
+
}
|
|
8881
|
+
if (changes['stickyOffset'] &&
|
|
8882
|
+
!changes['stickyOffset'].firstChange &&
|
|
8883
|
+
this.alwaysVisible) {
|
|
8884
|
+
// IntersectionObserver will handle visibility updates automatically
|
|
8885
|
+
this.updateFixedTrackPosition();
|
|
8886
|
+
}
|
|
8874
8887
|
}
|
|
8875
8888
|
ngAfterViewInit() {
|
|
8876
8889
|
this.updateScrollbar();
|
|
8877
8890
|
this.setupResizeObserver();
|
|
8878
|
-
this.setupDragListeners();
|
|
8879
|
-
// Apply initial scroll position if provided
|
|
8880
8891
|
if (this.scrollPosition !== undefined) {
|
|
8881
8892
|
this.applyScrollPosition();
|
|
8882
8893
|
}
|
|
8883
|
-
// Set initial scroll state to Start
|
|
8884
8894
|
this.updateScrollState(eScrollState.START);
|
|
8885
|
-
|
|
8895
|
+
if (this.alwaysVisible && !this.hideTrack) {
|
|
8896
|
+
this.setupAlwaysVisibleTracking();
|
|
8897
|
+
}
|
|
8886
8898
|
this.destroyRef.onDestroy(() => {
|
|
8887
8899
|
if (this.setPositionTimeout) {
|
|
8888
8900
|
clearTimeout(this.setPositionTimeout);
|
|
8889
8901
|
}
|
|
8890
|
-
this.
|
|
8891
|
-
|
|
8902
|
+
if (this.intersectionObserver) {
|
|
8903
|
+
this.intersectionObserver.disconnect();
|
|
8904
|
+
}
|
|
8892
8905
|
});
|
|
8893
8906
|
}
|
|
8894
|
-
/**
|
|
8895
|
-
* Applies the scroll position from input (programmatically)
|
|
8896
|
-
*/
|
|
8897
8907
|
applyScrollPosition() {
|
|
8898
8908
|
if (this.scrollPosition === undefined || !this.scrollContainer) {
|
|
8899
8909
|
return;
|
|
@@ -8901,45 +8911,38 @@ class StickyScrollbarComponent {
|
|
|
8901
8911
|
this.isSettingScrollPosition = true;
|
|
8902
8912
|
this.scrollContainer.nativeElement.scrollLeft = this.scrollPosition;
|
|
8903
8913
|
this.updateScrollbar();
|
|
8904
|
-
// Calculate and emit scroll state based on new position
|
|
8905
8914
|
const newState = this.calculateScrollState();
|
|
8906
8915
|
this.updateScrollState(newState);
|
|
8907
|
-
// Clear any existing timeout
|
|
8908
8916
|
if (this.setPositionTimeout) {
|
|
8909
8917
|
clearTimeout(this.setPositionTimeout);
|
|
8910
8918
|
}
|
|
8911
|
-
// Reset flag after a short delay to ensure scroll event is processed
|
|
8912
8919
|
this.setPositionTimeout = setTimeout(() => {
|
|
8913
8920
|
this.isSettingScrollPosition = false;
|
|
8914
8921
|
this.setPositionTimeout = undefined;
|
|
8915
8922
|
}, 0);
|
|
8916
8923
|
}
|
|
8917
|
-
/**
|
|
8918
|
-
* Updates scrollbar thumb size and position based on content
|
|
8919
|
-
*/
|
|
8920
8924
|
updateScrollbar() {
|
|
8921
8925
|
const container = this.scrollContainer.nativeElement;
|
|
8926
|
+
if (this.hideTrack) {
|
|
8927
|
+
const newState = this.calculateScrollState();
|
|
8928
|
+
this.updateScrollState(newState);
|
|
8929
|
+
return;
|
|
8930
|
+
}
|
|
8922
8931
|
const thumb = this.scrollThumb.nativeElement;
|
|
8932
|
+
const track = thumb.parentElement;
|
|
8923
8933
|
const containerWidth = container.clientWidth;
|
|
8924
8934
|
const contentWidth = container.scrollWidth;
|
|
8925
8935
|
const scrollLeft = container.scrollLeft;
|
|
8926
|
-
// Calculate thumb width as a ratio of visible content
|
|
8927
8936
|
const thumbWidth = (containerWidth / contentWidth) * containerWidth;
|
|
8928
8937
|
const thumbPosition = (scrollLeft / contentWidth) * containerWidth;
|
|
8929
|
-
// Hide scrollbar if content fits within container
|
|
8930
8938
|
const shouldShow = contentWidth > containerWidth;
|
|
8931
|
-
this.renderer.setStyle(
|
|
8932
|
-
this.renderer.setStyle(
|
|
8933
|
-
// Update thumb dimensions and position
|
|
8939
|
+
this.renderer.setStyle(track, 'opacity', shouldShow ? '1' : '0');
|
|
8940
|
+
this.renderer.setStyle(track, 'pointer-events', shouldShow ? 'auto' : 'none');
|
|
8934
8941
|
this.renderer.setStyle(thumb, 'width', `${thumbWidth}px`);
|
|
8935
8942
|
this.renderer.setStyle(thumb, 'transform', `translateX(${thumbPosition}px)`);
|
|
8936
|
-
// Update scroll state after scrollbar update
|
|
8937
8943
|
const newState = this.calculateScrollState();
|
|
8938
8944
|
this.updateScrollState(newState);
|
|
8939
8945
|
}
|
|
8940
|
-
/**
|
|
8941
|
-
* Observes container resize to update scrollbar
|
|
8942
|
-
*/
|
|
8943
8946
|
setupResizeObserver() {
|
|
8944
8947
|
const resizeObserver = new ResizeObserver(() => {
|
|
8945
8948
|
this.updateScrollbar();
|
|
@@ -8950,129 +8953,132 @@ class StickyScrollbarComponent {
|
|
|
8950
8953
|
resizeObserver.disconnect();
|
|
8951
8954
|
});
|
|
8952
8955
|
}
|
|
8953
|
-
|
|
8954
|
-
|
|
8955
|
-
|
|
8956
|
+
setupAlwaysVisibleTracking() {
|
|
8957
|
+
// Use IntersectionObserver for optimal performance - no layout thrashing
|
|
8958
|
+
const scrollbarTotalHeight = 10;
|
|
8959
|
+
const threshold = 10;
|
|
8960
|
+
// Shrink viewport to detect when scrollbar area is in the "safe zone"
|
|
8961
|
+
// The scrollbar appears at the bottom of the container, so we need to account for:
|
|
8962
|
+
// - threshold from top and bottom edges
|
|
8963
|
+
// - scrollbar height
|
|
8964
|
+
// - sticky offset
|
|
8965
|
+
const rootMarginTop = `-${threshold}px`;
|
|
8966
|
+
const rootMarginBottom = `-${scrollbarTotalHeight + threshold + this.stickyOffset}px`;
|
|
8967
|
+
const rootMargin = `${rootMarginTop} 0px ${rootMarginBottom} 0px`;
|
|
8968
|
+
this.intersectionObserver = new IntersectionObserver((entries) => {
|
|
8969
|
+
entries.forEach((entry) => {
|
|
8970
|
+
// When the container's bottom edge is in the "safe zone" (accounting for rootMargin),
|
|
8971
|
+
// isIntersecting will be true
|
|
8972
|
+
const newInViewValue = entry.isIntersecting;
|
|
8973
|
+
const rect = entry.boundingClientRect;
|
|
8974
|
+
this.isContainerInView.set(newInViewValue);
|
|
8975
|
+
this.updateFixedTrackPosition(rect);
|
|
8976
|
+
});
|
|
8977
|
+
}, {
|
|
8978
|
+
rootMargin: rootMargin,
|
|
8979
|
+
threshold: [0.25, 0.5, 0.75, 0.9, 0.99, 1],
|
|
8980
|
+
});
|
|
8981
|
+
this.intersectionObserver.observe(this.scrollContainer.nativeElement);
|
|
8982
|
+
}
|
|
8983
|
+
updateFixedTrackPosition(rect) {
|
|
8984
|
+
if (!this.alwaysVisible || this.hideTrack) {
|
|
8985
|
+
return;
|
|
8986
|
+
}
|
|
8987
|
+
const container = this.scrollContainer.nativeElement;
|
|
8988
|
+
const track = this.scrollThumb.nativeElement.parentElement;
|
|
8989
|
+
if (!track) {
|
|
8990
|
+
return;
|
|
8991
|
+
}
|
|
8992
|
+
// Only get rect if not provided (avoid duplicate getBoundingClientRect)
|
|
8993
|
+
const boundingRect = rect || container.getBoundingClientRect();
|
|
8994
|
+
if (this.isContainerInView()) {
|
|
8995
|
+
this.renderer.removeClass(track, 'fixed-mode');
|
|
8996
|
+
this.renderer.setStyle(track, 'position', 'sticky');
|
|
8997
|
+
this.renderer.removeStyle(track, 'left');
|
|
8998
|
+
this.renderer.removeStyle(track, 'width');
|
|
8999
|
+
}
|
|
9000
|
+
else {
|
|
9001
|
+
this.renderer.addClass(track, 'fixed-mode');
|
|
9002
|
+
this.renderer.setStyle(track, 'position', 'fixed');
|
|
9003
|
+
this.renderer.setStyle(track, 'left', `${boundingRect.left}px`);
|
|
9004
|
+
this.renderer.setStyle(track, 'width', `${boundingRect.width}px`);
|
|
9005
|
+
}
|
|
9006
|
+
}
|
|
8956
9007
|
updateScrollState(newState) {
|
|
8957
9008
|
if (this.currentScrollState !== newState) {
|
|
8958
9009
|
this.currentScrollState = newState;
|
|
8959
9010
|
this.scrollStateChange.emit(newState);
|
|
8960
9011
|
}
|
|
8961
9012
|
}
|
|
8962
|
-
/**
|
|
8963
|
-
* Calculates the scroll state based on current scroll position
|
|
8964
|
-
*/
|
|
8965
9013
|
calculateScrollState() {
|
|
8966
9014
|
const container = this.scrollContainer.nativeElement;
|
|
8967
9015
|
const containerWidth = container.clientWidth;
|
|
8968
9016
|
const contentWidth = container.scrollWidth;
|
|
8969
9017
|
const scrollLeft = container.scrollLeft;
|
|
8970
9018
|
const maxScroll = contentWidth - containerWidth;
|
|
8971
|
-
// Check if scrollbar is not needed
|
|
8972
9019
|
if (contentWidth <= containerWidth) {
|
|
8973
9020
|
return eScrollState.NOT_NEEDED;
|
|
8974
9021
|
}
|
|
8975
|
-
// Determine scroll state based on position
|
|
8976
9022
|
if (scrollLeft <= 1) {
|
|
8977
|
-
// At the start (with small tolerance for rounding)
|
|
8978
9023
|
return eScrollState.START;
|
|
8979
9024
|
}
|
|
8980
|
-
|
|
8981
|
-
// At the end (with small tolerance for rounding)
|
|
9025
|
+
if (scrollLeft >= maxScroll - 1) {
|
|
8982
9026
|
return eScrollState.END;
|
|
8983
9027
|
}
|
|
8984
|
-
|
|
8985
|
-
// In the middle
|
|
8986
|
-
return eScrollState.SCROLLING;
|
|
8987
|
-
}
|
|
9028
|
+
return eScrollState.SCROLLING;
|
|
8988
9029
|
}
|
|
8989
|
-
/**
|
|
8990
|
-
* Handles scroll event on the container
|
|
8991
|
-
*/
|
|
8992
9030
|
onScroll() {
|
|
8993
9031
|
if (!this.isDragging) {
|
|
8994
9032
|
this.updateScrollbar();
|
|
8995
9033
|
}
|
|
8996
|
-
// Emit scroll position only if it's user-initiated (not programmatically set)
|
|
8997
9034
|
if (!this.isSettingScrollPosition) {
|
|
8998
|
-
const
|
|
8999
|
-
const scrollLeft = container.scrollLeft;
|
|
9035
|
+
const scrollLeft = this.scrollContainer.nativeElement.scrollLeft;
|
|
9000
9036
|
this.scrollPositionChange.emit(scrollLeft);
|
|
9001
|
-
// Calculate and emit scroll state based on position
|
|
9002
9037
|
const newState = this.calculateScrollState();
|
|
9003
9038
|
this.updateScrollState(newState);
|
|
9004
9039
|
}
|
|
9005
9040
|
}
|
|
9006
|
-
/**
|
|
9007
|
-
* Handles mouse down on scrollbar thumb
|
|
9008
|
-
*/
|
|
9009
9041
|
onThumbMouseDown(event) {
|
|
9010
9042
|
event.preventDefault();
|
|
9011
9043
|
event.stopPropagation();
|
|
9012
9044
|
this.isDragging = true;
|
|
9013
9045
|
this.dragStartX = event.clientX;
|
|
9014
9046
|
this.scrollStartLeft = this.scrollContainer.nativeElement.scrollLeft;
|
|
9015
|
-
// Emit drag start event
|
|
9016
|
-
this.dragStart$.next(event);
|
|
9017
9047
|
}
|
|
9018
|
-
|
|
9019
|
-
|
|
9020
|
-
*/
|
|
9021
|
-
setupDragListeners() {
|
|
9022
|
-
const mouseMove$ = fromEvent(document, 'mousemove');
|
|
9023
|
-
const mouseUp$ = fromEvent(document, 'mouseup');
|
|
9024
|
-
// Handle mouse move - only active when dragging
|
|
9025
|
-
mouseMove$
|
|
9026
|
-
.pipe(filter(() => this.isDragging), takeUntilDestroyed(this.destroyRef))
|
|
9027
|
-
.subscribe((event) => {
|
|
9048
|
+
onWindowMouseMove(event) {
|
|
9049
|
+
if (this.isDragging) {
|
|
9028
9050
|
this.onThumbDrag(event);
|
|
9029
|
-
}
|
|
9030
|
-
|
|
9031
|
-
|
|
9032
|
-
|
|
9033
|
-
.subscribe(() => {
|
|
9051
|
+
}
|
|
9052
|
+
}
|
|
9053
|
+
onWindowMouseUp() {
|
|
9054
|
+
if (this.isDragging) {
|
|
9034
9055
|
this.onThumbMouseUp();
|
|
9035
|
-
|
|
9036
|
-
|
|
9056
|
+
}
|
|
9057
|
+
}
|
|
9058
|
+
onWindowMouseLeave() {
|
|
9059
|
+
if (this.isDragging) {
|
|
9060
|
+
this.onThumbMouseUp();
|
|
9061
|
+
}
|
|
9037
9062
|
}
|
|
9038
|
-
/**
|
|
9039
|
-
* Handles thumb dragging
|
|
9040
|
-
*/
|
|
9041
9063
|
onThumbDrag(event) {
|
|
9064
|
+
event.preventDefault();
|
|
9065
|
+
event.stopPropagation();
|
|
9042
9066
|
const container = this.scrollContainer.nativeElement;
|
|
9043
9067
|
const deltaX = event.clientX - this.dragStartX;
|
|
9044
|
-
// Calculate scroll delta based on content/container ratio
|
|
9045
9068
|
const containerWidth = container.clientWidth;
|
|
9046
9069
|
const contentWidth = container.scrollWidth;
|
|
9047
9070
|
const scrollDelta = (deltaX / containerWidth) * contentWidth;
|
|
9048
|
-
// Update scroll position
|
|
9049
9071
|
container.scrollLeft = this.scrollStartLeft + scrollDelta;
|
|
9050
|
-
// Update scrollbar position during drag
|
|
9051
9072
|
this.updateScrollbar();
|
|
9052
|
-
|
|
9053
|
-
|
|
9054
|
-
this.scrollPositionChange.emit(scrollLeft);
|
|
9055
|
-
// Calculate and emit scroll state based on position
|
|
9056
|
-
const newState = this.calculateScrollState();
|
|
9057
|
-
this.updateScrollState(newState);
|
|
9073
|
+
this.scrollPositionChange.emit(container.scrollLeft);
|
|
9074
|
+
this.updateScrollState(this.calculateScrollState());
|
|
9058
9075
|
}
|
|
9059
|
-
/**
|
|
9060
|
-
* Handles mouse up to end dragging
|
|
9061
|
-
*/
|
|
9062
9076
|
onThumbMouseUp() {
|
|
9063
9077
|
this.isDragging = false;
|
|
9064
9078
|
}
|
|
9065
|
-
/**
|
|
9066
|
-
* Public method to manually refresh the scrollbar
|
|
9067
|
-
* Useful when content or container dimensions change programmatically
|
|
9068
|
-
*/
|
|
9069
9079
|
refresh() {
|
|
9070
9080
|
this.updateScrollbar();
|
|
9071
9081
|
}
|
|
9072
|
-
/**
|
|
9073
|
-
* Public method to scroll to the end of the container
|
|
9074
|
-
* Useful when resizing the last element or when you want to ensure the end is visible
|
|
9075
|
-
*/
|
|
9076
9082
|
scrollToEnd() {
|
|
9077
9083
|
if (!this.scrollContainer) {
|
|
9078
9084
|
return;
|
|
@@ -9082,27 +9088,22 @@ class StickyScrollbarComponent {
|
|
|
9082
9088
|
this.isSettingScrollPosition = true;
|
|
9083
9089
|
container.scrollLeft = maxScroll;
|
|
9084
9090
|
this.updateScrollbar();
|
|
9085
|
-
|
|
9086
|
-
const newState = this.calculateScrollState();
|
|
9087
|
-
this.updateScrollState(newState);
|
|
9088
|
-
// Emit the new scroll position
|
|
9091
|
+
this.updateScrollState(this.calculateScrollState());
|
|
9089
9092
|
this.scrollPositionChange.emit(maxScroll);
|
|
9090
|
-
// Clear any existing timeout
|
|
9091
9093
|
if (this.setPositionTimeout) {
|
|
9092
9094
|
clearTimeout(this.setPositionTimeout);
|
|
9093
9095
|
}
|
|
9094
|
-
// Reset flag after a short delay to ensure scroll event is processed
|
|
9095
9096
|
this.setPositionTimeout = setTimeout(() => {
|
|
9096
9097
|
this.isSettingScrollPosition = false;
|
|
9097
9098
|
this.setPositionTimeout = undefined;
|
|
9098
9099
|
}, 0);
|
|
9099
9100
|
}
|
|
9100
9101
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: StickyScrollbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
9101
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
9102
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: StickyScrollbarComponent, isStandalone: true, selector: "ca-sticky-scrollbar", inputs: { scrollPosition: "scrollPosition", hideTrack: "hideTrack", alwaysVisible: "alwaysVisible", stickyOffset: "stickyOffset" }, outputs: { scrollPositionChange: "scrollPositionChange", scrollStateChange: "scrollStateChange" }, host: { listeners: { "window:mousemove": "onWindowMouseMove($event)", "window:mouseup": "onWindowMouseUp()", "window:mouseleave": "onWindowMouseLeave()" } }, viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "scrollThumb", first: true, predicate: ["scrollThumb"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"sticky-scrollbar-wrapper\">\n <div\n #scrollContainer\n class=\"sticky-scrollbar-container\"\n (scroll)=\"onScroll()\"\n >\n <ng-content></ng-content>\n </div>\n @if (alwaysVisible && !isContainerInView()) {\n <div class=\"sticky-scrollbar-placeholder\"></div>\n }\n <div\n class=\"sticky-scrollbar-track\"\n [class.hidden]=\"hideTrack\"\n [class.always-visible]=\"alwaysVisible\"\n [class.fixed-mode]=\"alwaysVisible && !isContainerInView()\"\n [style.bottom.px]=\"stickyOffset\"\n >\n <div\n #scrollThumb\n class=\"sticky-scrollbar-thumb\"\n [class.dragging]=\"isDragging\"\n (mousedown)=\"onThumbMouseDown($event)\"\n (mouseup)=\"onThumbMouseUp()\"\n ></div>\n </div>\n</div>\n", styles: [".sticky-scrollbar-wrapper{position:relative;height:100%;width:100%;display:flex;flex-direction:column}.sticky-scrollbar-container{flex:1;width:fit-content;max-width:100%;overflow-x:auto;overflow-y:hidden;contain:layout style paint;will-change:scroll-position;-ms-overflow-style:none;scrollbar-width:none}.sticky-scrollbar-container::-webkit-scrollbar{display:none}.sticky-scrollbar-placeholder{height:10px;visibility:hidden;pointer-events:none}.sticky-scrollbar-track{position:sticky;bottom:0;width:100%;overflow-x:hidden;overflow-y:visible;height:10px;display:flex;align-items:center;border-radius:2px;margin-top:0;margin-bottom:0;transition:opacity .1s ease-in-out;z-index:10}.sticky-scrollbar-track.hidden{display:none}.sticky-scrollbar-track.always-visible{z-index:1000}.sticky-scrollbar-track.always-visible.fixed-mode{margin:0}.sticky-scrollbar-thumb{position:relative;height:6px;background-color:#aaa;border-radius:2px;transition:background-color .1s ease-in-out,width .1s ease-in-out;cursor:grab;min-width:30px;will-change:transform,width;transform:translateZ(0)}.sticky-scrollbar-thumb:before{content:\"\";position:absolute;top:-2px;left:0;right:0;height:2px;cursor:grab;pointer-events:auto}.sticky-scrollbar-thumb:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;cursor:grab;pointer-events:auto}.sticky-scrollbar-thumb:hover{background-color:#424242b2}.sticky-scrollbar-thumb.dragging{background-color:#424242b2;cursor:grabbing}.sticky-scrollbar-thumb.dragging:before,.sticky-scrollbar-thumb.dragging:after{cursor:grabbing}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
|
|
9102
9103
|
}
|
|
9103
9104
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: StickyScrollbarComponent, decorators: [{
|
|
9104
9105
|
type: Component,
|
|
9105
|
-
args: [{ selector: 'ca-sticky-scrollbar', imports: [CommonModule], template: "<div class=\"sticky-scrollbar-wrapper\">\n <div\n #scrollContainer\n class=\"sticky-scrollbar-container\"\n (scroll)=\"onScroll()\"\n >\n <ng-content></ng-content>\n </div>\n <div\n class=\"sticky-scrollbar-track\"\n [class.hidden]=\"hideTrack\"\n [style.bottom.px]=\"stickyOffset\"\n >\n <div\n #scrollThumb\n class=\"sticky-scrollbar-thumb\"\n [class.dragging]=\"isDragging\"\n (mousedown)=\"onThumbMouseDown($event)\"\n (mouseup)=\"onThumbMouseUp()\"\n ></div>\n </div>\n</div>\n", styles: [".sticky-scrollbar-wrapper{position:relative;height:100%;width:100%;display:flex;flex-direction:column}.sticky-scrollbar-container{flex:1;width:fit-content;max-width:100%;overflow-x:auto;overflow-y:hidden;-ms-overflow-style:none;scrollbar-width:none}.sticky-scrollbar-container::-webkit-scrollbar{display:none}.sticky-scrollbar-track{position:sticky;bottom:0;width:100%;overflow-x:hidden;height:
|
|
9106
|
+
args: [{ selector: 'ca-sticky-scrollbar', imports: [CommonModule], template: "<div class=\"sticky-scrollbar-wrapper\">\n <div\n #scrollContainer\n class=\"sticky-scrollbar-container\"\n (scroll)=\"onScroll()\"\n >\n <ng-content></ng-content>\n </div>\n @if (alwaysVisible && !isContainerInView()) {\n <div class=\"sticky-scrollbar-placeholder\"></div>\n }\n <div\n class=\"sticky-scrollbar-track\"\n [class.hidden]=\"hideTrack\"\n [class.always-visible]=\"alwaysVisible\"\n [class.fixed-mode]=\"alwaysVisible && !isContainerInView()\"\n [style.bottom.px]=\"stickyOffset\"\n >\n <div\n #scrollThumb\n class=\"sticky-scrollbar-thumb\"\n [class.dragging]=\"isDragging\"\n (mousedown)=\"onThumbMouseDown($event)\"\n (mouseup)=\"onThumbMouseUp()\"\n ></div>\n </div>\n</div>\n", styles: [".sticky-scrollbar-wrapper{position:relative;height:100%;width:100%;display:flex;flex-direction:column}.sticky-scrollbar-container{flex:1;width:fit-content;max-width:100%;overflow-x:auto;overflow-y:hidden;contain:layout style paint;will-change:scroll-position;-ms-overflow-style:none;scrollbar-width:none}.sticky-scrollbar-container::-webkit-scrollbar{display:none}.sticky-scrollbar-placeholder{height:10px;visibility:hidden;pointer-events:none}.sticky-scrollbar-track{position:sticky;bottom:0;width:100%;overflow-x:hidden;overflow-y:visible;height:10px;display:flex;align-items:center;border-radius:2px;margin-top:0;margin-bottom:0;transition:opacity .1s ease-in-out;z-index:10}.sticky-scrollbar-track.hidden{display:none}.sticky-scrollbar-track.always-visible{z-index:1000}.sticky-scrollbar-track.always-visible.fixed-mode{margin:0}.sticky-scrollbar-thumb{position:relative;height:6px;background-color:#aaa;border-radius:2px;transition:background-color .1s ease-in-out,width .1s ease-in-out;cursor:grab;min-width:30px;will-change:transform,width;transform:translateZ(0)}.sticky-scrollbar-thumb:before{content:\"\";position:absolute;top:-2px;left:0;right:0;height:2px;cursor:grab;pointer-events:auto}.sticky-scrollbar-thumb:after{content:\"\";position:absolute;bottom:-2px;left:0;right:0;height:2px;cursor:grab;pointer-events:auto}.sticky-scrollbar-thumb:hover{background-color:#424242b2}.sticky-scrollbar-thumb.dragging{background-color:#424242b2;cursor:grabbing}.sticky-scrollbar-thumb.dragging:before,.sticky-scrollbar-thumb.dragging:after{cursor:grabbing}\n"] }]
|
|
9106
9107
|
}], propDecorators: { scrollContainer: [{
|
|
9107
9108
|
type: ViewChild,
|
|
9108
9109
|
args: ['scrollContainer', { static: false }]
|
|
@@ -9113,12 +9114,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
|
|
|
9113
9114
|
type: Input
|
|
9114
9115
|
}], hideTrack: [{
|
|
9115
9116
|
type: Input
|
|
9117
|
+
}], alwaysVisible: [{
|
|
9118
|
+
type: Input
|
|
9116
9119
|
}], stickyOffset: [{
|
|
9117
9120
|
type: Input
|
|
9118
9121
|
}], scrollPositionChange: [{
|
|
9119
9122
|
type: Output
|
|
9120
9123
|
}], scrollStateChange: [{
|
|
9121
9124
|
type: Output
|
|
9125
|
+
}], onWindowMouseMove: [{
|
|
9126
|
+
type: HostListener,
|
|
9127
|
+
args: ['window:mousemove', ['$event']]
|
|
9128
|
+
}], onWindowMouseUp: [{
|
|
9129
|
+
type: HostListener,
|
|
9130
|
+
args: ['window:mouseup']
|
|
9131
|
+
}], onWindowMouseLeave: [{
|
|
9132
|
+
type: HostListener,
|
|
9133
|
+
args: ['window:mouseleave']
|
|
9122
9134
|
}] } });
|
|
9123
9135
|
|
|
9124
9136
|
class DispatchSearchFilterPipe {
|