@ts-core/angular 13.1.30 → 13.1.31

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.
@@ -2,14 +2,22 @@ import { ElementRef, EventEmitter } from '@angular/core';
2
2
  import { DestroyableContainer } from '@ts-core/common';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class ScrollCheckDirective extends DestroyableContainer {
5
+ top: EventEmitter<boolean>;
6
+ bottom: EventEmitter<boolean>;
5
7
  limitExceed: EventEmitter<boolean>;
6
8
  private _scrollLimit;
7
- private _scrollValue;
9
+ private element;
10
+ private isTop;
11
+ private isBottom;
8
12
  private isExceedLimit;
13
+ offset: number;
9
14
  constructor(element: ElementRef);
10
- protected check(): void;
15
+ protected check: () => void;
16
+ protected get scrollValue(): number;
17
+ protected get scrollHeight(): number;
18
+ protected get clientHeight(): number;
11
19
  set scrollLimit(value: number);
12
20
  get scrollLimit(): number;
13
21
  static ɵfac: i0.ɵɵFactoryDeclaration<ScrollCheckDirective, never>;
14
- static ɵdir: i0.ɵɵDirectiveDeclaration<ScrollCheckDirective, "[vi-scroll-check]", never, { "scrollLimit": "vi-scroll-check"; }, { "limitExceed": "limitExceed"; }, never>;
22
+ static ɵdir: i0.ɵɵDirectiveDeclaration<ScrollCheckDirective, "[vi-scroll-check]", never, { "offset": "offset"; "scrollLimit": "vi-scroll-check"; }, { "top": "top"; "bottom": "bottom"; "limitExceed": "limitExceed"; }, never>;
15
23
  }
@@ -17,27 +17,56 @@ export class ScrollCheckDirective extends DestroyableContainer {
17
17
  // Properties
18
18
  //
19
19
  //--------------------------------------------------------------------------
20
+ this.top = new EventEmitter();
21
+ this.bottom = new EventEmitter();
20
22
  this.limitExceed = new EventEmitter();
23
+ this.isTop = false;
24
+ this.isBottom = false;
21
25
  this.isExceedLimit = false;
22
- this._scrollValue = element.nativeElement.scrollTop;
23
- fromEvent(element.nativeElement, 'scroll')
24
- .pipe(debounceTime(DateUtil.MILISECONDS_SECOND / 10), takeUntil(this.destroyed))
25
- .subscribe(() => {
26
- this._scrollValue = element.nativeElement.scrollTop;
27
- this.check();
28
- });
26
+ this.offset = 50;
27
+ //--------------------------------------------------------------------------
28
+ //
29
+ // Protected Methods
30
+ //
31
+ //--------------------------------------------------------------------------
32
+ this.check = () => {
33
+ let value = this.scrollValue >= this.scrollLimit;
34
+ if (value !== this.isExceedLimit) {
35
+ this.isExceedLimit = value;
36
+ this.limitExceed.emit(this.isExceedLimit);
37
+ }
38
+ value = this.scrollValue + this.clientHeight + this.offset > this.scrollHeight;
39
+ if (value != this.isBottom) {
40
+ this.bottom.next(value);
41
+ }
42
+ value = this.scrollValue < this.offset;
43
+ if (value != this.isTop) {
44
+ this.top.next(value);
45
+ }
46
+ };
47
+ this.element = element.nativeElement;
48
+ fromEvent(this.element, 'scroll')
49
+ .pipe(debounceTime(DateUtil.MILLISECONDS_SECOND / 10), takeUntil(this.destroyed))
50
+ .subscribe(this.check);
29
51
  }
30
52
  //--------------------------------------------------------------------------
31
53
  //
32
- // Protected Methods
54
+ // Private Properties
33
55
  //
34
56
  //--------------------------------------------------------------------------
35
- check() {
36
- let value = this._scrollValue >= this.scrollLimit;
37
- if (value !== this.isExceedLimit) {
38
- this.isExceedLimit = value;
39
- this.limitExceed.emit(this.isExceedLimit);
40
- }
57
+ // --------------------------------------------------------------------------
58
+ //
59
+ // Private Properties
60
+ //
61
+ // --------------------------------------------------------------------------
62
+ get scrollValue() {
63
+ return this.element.scrollTop;
64
+ }
65
+ get scrollHeight() {
66
+ return this.element.scrollHeight;
67
+ }
68
+ get clientHeight() {
69
+ return this.element.clientHeight;
41
70
  }
42
71
  //--------------------------------------------------------------------------
43
72
  //
@@ -56,16 +85,22 @@ export class ScrollCheckDirective extends DestroyableContainer {
56
85
  }
57
86
  }
58
87
  ScrollCheckDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ScrollCheckDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
59
- ScrollCheckDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: ScrollCheckDirective, selector: "[vi-scroll-check]", inputs: { scrollLimit: ["vi-scroll-check", "scrollLimit"] }, outputs: { limitExceed: "limitExceed" }, usesInheritance: true, ngImport: i0 });
88
+ ScrollCheckDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: ScrollCheckDirective, selector: "[vi-scroll-check]", inputs: { offset: "offset", scrollLimit: ["vi-scroll-check", "scrollLimit"] }, outputs: { top: "top", bottom: "bottom", limitExceed: "limitExceed" }, usesInheritance: true, ngImport: i0 });
60
89
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ScrollCheckDirective, decorators: [{
61
90
  type: Directive,
62
91
  args: [{
63
92
  selector: '[vi-scroll-check]'
64
93
  }]
65
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { limitExceed: [{
94
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { top: [{
95
+ type: Output
96
+ }], bottom: [{
97
+ type: Output
98
+ }], limitExceed: [{
66
99
  type: Output
100
+ }], offset: [{
101
+ type: Input
67
102
  }], scrollLimit: [{
68
103
  type: Input,
69
104
  args: ['vi-scroll-check']
70
105
  }] } });
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Nyb2xsQ2hlY2tEaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGlyZWN0aXZlL1Njcm9sbENoZWNrRGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBSy9DLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxvQkFBb0I7SUFjMUQsNEVBQTRFO0lBQzVFLEVBQUU7SUFDRixjQUFjO0lBQ2QsRUFBRTtJQUNGLDRFQUE0RTtJQUU1RSxZQUFZLE9BQW1CO1FBQzNCLEtBQUssRUFBRSxDQUFDO1FBcEJaLDRFQUE0RTtRQUM1RSxFQUFFO1FBQ0YsYUFBYTtRQUNiLEVBQUU7UUFDRiw0RUFBNEU7UUFHckUsZ0JBQVcsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUl2RCxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQVduQyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO1FBQ3BELFNBQVMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQzthQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQy9FLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO1lBQ3BELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsRUFBRTtJQUNGLG9CQUFvQjtJQUNwQixFQUFFO0lBQ0YsNEVBQTRFO0lBRWxFLEtBQUs7UUFDWCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDbEQsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDN0M7SUFDTCxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLEVBQUU7SUFDRixvQkFBb0I7SUFDcEIsRUFBRTtJQUNGLDRFQUE0RTtJQUU1RSxJQUNXLFdBQVcsQ0FBQyxLQUFhO1FBQ2hDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDNUIsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFDRCxJQUFXLFdBQVc7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7O2tIQTlEUSxvQkFBb0I7c0dBQXBCLG9CQUFvQjs0RkFBcEIsb0JBQW9CO2tCQUhoQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxtQkFBbUI7aUJBQ2hDO2lHQVNVLFdBQVc7c0JBRGpCLE1BQU07Z0JBOENJLFdBQVc7c0JBRHJCLEtBQUs7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERlc3Ryb3lhYmxlQ29udGFpbmVyIH0gZnJvbSAnQHRzLWNvcmUvY29tbW9uJztcbmltcG9ydCB7IERhdGVVdGlsIH0gZnJvbSAnQHRzLWNvcmUvY29tbW9uJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbdmktc2Nyb2xsLWNoZWNrXSdcbn0pXG5leHBvcnQgY2xhc3MgU2Nyb2xsQ2hlY2tEaXJlY3RpdmUgZXh0ZW5kcyBEZXN0cm95YWJsZUNvbnRhaW5lciB7XG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdFByb3BlcnRpZXNcbiAgICAvL1xuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBsaW1pdEV4Y2VlZDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHJpdmF0ZSBfc2Nyb2xsTGltaXQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF9zY3JvbGxWYWx1ZTogbnVtYmVyO1xuICAgIHByaXZhdGUgaXNFeGNlZWRMaW1pdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdENvbnN0cnVjdG9yXG4gICAgLy9cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5fc2Nyb2xsVmFsdWUgPSBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgICAgICBmcm9tRXZlbnQoZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJylcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZShEYXRlVXRpbC5NSUxJU0VDT05EU19TRUNPTkQgLyAxMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxWYWx1ZSA9IGVsZW1lbnQubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy9cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBwcm90ZWN0ZWQgY2hlY2soKTogdm9pZCB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX3Njcm9sbFZhbHVlID49IHRoaXMuc2Nyb2xsTGltaXQ7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5pc0V4Y2VlZExpbWl0KSB7XG4gICAgICAgICAgICB0aGlzLmlzRXhjZWVkTGltaXQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMubGltaXRFeGNlZWQuZW1pdCh0aGlzLmlzRXhjZWVkTGltaXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdFB1YmxpYyBQcm9wZXJ0aWVzXG4gICAgLy9cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBASW5wdXQoJ3ZpLXNjcm9sbC1jaGVjaycpXG4gICAgcHVibGljIHNldCBzY3JvbGxMaW1pdCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSB0aGlzLl9zY3JvbGxMaW1pdCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Njcm9sbExpbWl0ID0gdmFsdWU7XG4gICAgICAgIHRoaXMuY2hlY2soKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBzY3JvbGxMaW1pdCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsTGltaXQ7XG4gICAgfVxufVxuIl19
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Nyb2xsQ2hlY2tEaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGlyZWN0aXZlL1Njcm9sbENoZWNrRGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBSy9DLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxvQkFBb0I7SUF5QjFELDRFQUE0RTtJQUM1RSxFQUFFO0lBQ0YsY0FBYztJQUNkLEVBQUU7SUFDRiw0RUFBNEU7SUFFNUUsWUFBWSxPQUFtQjtRQUMzQixLQUFLLEVBQUUsQ0FBQztRQS9CWiw0RUFBNEU7UUFDNUUsRUFBRTtRQUNGLGFBQWE7UUFDYixFQUFFO1FBQ0YsNEVBQTRFO1FBR3JFLFFBQUcsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVoRCxXQUFNLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbkQsZ0JBQVcsR0FBMEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQU12RCxVQUFLLEdBQVksS0FBSyxDQUFDO1FBQ3ZCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFHaEMsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQWlCM0IsNEVBQTRFO1FBQzVFLEVBQUU7UUFDRixvQkFBb0I7UUFDcEIsRUFBRTtRQUNGLDRFQUE0RTtRQUVsRSxVQUFLLEdBQUcsR0FBUyxFQUFFO1lBQ3pCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUNqRCxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUM5QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzdDO1lBRUQsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDL0UsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDM0I7WUFFRCxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hCO1FBQ0wsQ0FBQyxDQUFDO1FBN0JFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUVyQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUM7YUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNoRixTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUEwQkQsNEVBQTRFO0lBQzVFLEVBQUU7SUFDRixxQkFBcUI7SUFDckIsRUFBRTtJQUNGLDRFQUE0RTtJQUU1RSw2RUFBNkU7SUFDN0UsRUFBRTtJQUNGLHFCQUFxQjtJQUNyQixFQUFFO0lBQ0YsNkVBQTZFO0lBRTdFLElBQWMsV0FBVztRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUFjLFlBQVk7UUFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztJQUNyQyxDQUFDO0lBQ0QsSUFBYyxZQUFZO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7SUFDckMsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxFQUFFO0lBQ0Ysb0JBQW9CO0lBQ3BCLEVBQUU7SUFDRiw0RUFBNEU7SUFFNUUsSUFDVyxXQUFXLENBQUMsS0FBYTtRQUNoQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzVCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBQ0QsSUFBVyxXQUFXO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDOztrSEF0R1Esb0JBQW9CO3NHQUFwQixvQkFBb0I7NEZBQXBCLG9CQUFvQjtrQkFIaEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsbUJBQW1CO2lCQUNoQztpR0FTVSxHQUFHO3NCQURULE1BQU07Z0JBR0EsTUFBTTtzQkFEWixNQUFNO2dCQUdBLFdBQVc7c0JBRGpCLE1BQU07Z0JBWUEsTUFBTTtzQkFEWixLQUFLO2dCQXVFSyxXQUFXO3NCQURyQixLQUFLO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEZXN0cm95YWJsZUNvbnRhaW5lciB9IGZyb20gJ0B0cy1jb3JlL2NvbW1vbic7XG5pbXBvcnQgeyBEYXRlVXRpbCB9IGZyb20gJ0B0cy1jb3JlL2NvbW1vbic7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW3ZpLXNjcm9sbC1jaGVja10nXG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbENoZWNrRGlyZWN0aXZlIGV4dGVuZHMgRGVzdHJveWFibGVDb250YWluZXIge1xuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvL1xuICAgIC8vXHRQcm9wZXJ0aWVzXG4gICAgLy9cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdG9wOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGJvdHRvbTogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBsaW1pdEV4Y2VlZDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgcHJpdmF0ZSBfc2Nyb2xsTGltaXQ6IG51bWJlcjtcblxuICAgIHByaXZhdGUgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICBwcml2YXRlIGlzVG9wOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpc0JvdHRvbTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgaXNFeGNlZWRMaW1pdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb2Zmc2V0OiBudW1iZXIgPSA1MDtcblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvL1xuICAgIC8vXHRDb25zdHJ1Y3RvclxuICAgIC8vXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgZnJvbUV2ZW50KHRoaXMuZWxlbWVudCwgJ3Njcm9sbCcpXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoRGF0ZVV0aWwuTUlMTElTRUNPTkRTX1NFQ09ORCAvIDEwKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy5jaGVjayk7XG4gICAgfVxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdFByb3RlY3RlZCBNZXRob2RzXG4gICAgLy9cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBwcm90ZWN0ZWQgY2hlY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuc2Nyb2xsVmFsdWUgPj0gdGhpcy5zY3JvbGxMaW1pdDtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLmlzRXhjZWVkTGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNFeGNlZWRMaW1pdCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5saW1pdEV4Y2VlZC5lbWl0KHRoaXMuaXNFeGNlZWRMaW1pdCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YWx1ZSA9IHRoaXMuc2Nyb2xsVmFsdWUgKyB0aGlzLmNsaWVudEhlaWdodCArIHRoaXMub2Zmc2V0ID4gdGhpcy5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIGlmICh2YWx1ZSAhPSB0aGlzLmlzQm90dG9tKSB7XG4gICAgICAgICAgICB0aGlzLmJvdHRvbS5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gdGhpcy5zY3JvbGxWYWx1ZSA8IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAodmFsdWUgIT0gdGhpcy5pc1RvcCkge1xuICAgICAgICAgICAgdGhpcy50b3AubmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vXG4gICAgLy9cdFByaXZhdGUgUHJvcGVydGllc1xuICAgIC8vXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvL1xuICAgIC8vXHRQcml2YXRlIFByb3BlcnRpZXNcbiAgICAvL1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICBwcm90ZWN0ZWQgZ2V0IHNjcm9sbFZhbHVlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgZ2V0IHNjcm9sbEhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgfVxuICAgIHByb3RlY3RlZCBnZXQgY2xpZW50SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIH1cblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvL1xuICAgIC8vXHRQdWJsaWMgUHJvcGVydGllc1xuICAgIC8vXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgQElucHV0KCd2aS1zY3JvbGwtY2hlY2snKVxuICAgIHB1YmxpYyBzZXQgc2Nyb2xsTGltaXQodmFsdWU6IG51bWJlcikge1xuICAgICAgICBpZiAodmFsdWUgPT0gdGhpcy5fc2Nyb2xsTGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zY3JvbGxMaW1pdCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmNoZWNrKCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgc2Nyb2xsTGltaXQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Njcm9sbExpbWl0O1xuICAgIH1cbn1cbiJdfQ==
@@ -2951,27 +2951,56 @@ class ScrollCheckDirective extends DestroyableContainer {
2951
2951
  // Properties
2952
2952
  //
2953
2953
  //--------------------------------------------------------------------------
2954
+ this.top = new EventEmitter();
2955
+ this.bottom = new EventEmitter();
2954
2956
  this.limitExceed = new EventEmitter();
2957
+ this.isTop = false;
2958
+ this.isBottom = false;
2955
2959
  this.isExceedLimit = false;
2956
- this._scrollValue = element.nativeElement.scrollTop;
2957
- fromEvent(element.nativeElement, 'scroll')
2958
- .pipe(debounceTime(DateUtil.MILISECONDS_SECOND / 10), takeUntil(this.destroyed))
2959
- .subscribe(() => {
2960
- this._scrollValue = element.nativeElement.scrollTop;
2961
- this.check();
2962
- });
2960
+ this.offset = 50;
2961
+ //--------------------------------------------------------------------------
2962
+ //
2963
+ // Protected Methods
2964
+ //
2965
+ //--------------------------------------------------------------------------
2966
+ this.check = () => {
2967
+ let value = this.scrollValue >= this.scrollLimit;
2968
+ if (value !== this.isExceedLimit) {
2969
+ this.isExceedLimit = value;
2970
+ this.limitExceed.emit(this.isExceedLimit);
2971
+ }
2972
+ value = this.scrollValue + this.clientHeight + this.offset > this.scrollHeight;
2973
+ if (value != this.isBottom) {
2974
+ this.bottom.next(value);
2975
+ }
2976
+ value = this.scrollValue < this.offset;
2977
+ if (value != this.isTop) {
2978
+ this.top.next(value);
2979
+ }
2980
+ };
2981
+ this.element = element.nativeElement;
2982
+ fromEvent(this.element, 'scroll')
2983
+ .pipe(debounceTime(DateUtil.MILLISECONDS_SECOND / 10), takeUntil(this.destroyed))
2984
+ .subscribe(this.check);
2963
2985
  }
2964
2986
  //--------------------------------------------------------------------------
2965
2987
  //
2966
- // Protected Methods
2988
+ // Private Properties
2967
2989
  //
2968
2990
  //--------------------------------------------------------------------------
2969
- check() {
2970
- let value = this._scrollValue >= this.scrollLimit;
2971
- if (value !== this.isExceedLimit) {
2972
- this.isExceedLimit = value;
2973
- this.limitExceed.emit(this.isExceedLimit);
2974
- }
2991
+ // --------------------------------------------------------------------------
2992
+ //
2993
+ // Private Properties
2994
+ //
2995
+ // --------------------------------------------------------------------------
2996
+ get scrollValue() {
2997
+ return this.element.scrollTop;
2998
+ }
2999
+ get scrollHeight() {
3000
+ return this.element.scrollHeight;
3001
+ }
3002
+ get clientHeight() {
3003
+ return this.element.clientHeight;
2975
3004
  }
2976
3005
  //--------------------------------------------------------------------------
2977
3006
  //
@@ -2990,14 +3019,20 @@ class ScrollCheckDirective extends DestroyableContainer {
2990
3019
  }
2991
3020
  }
2992
3021
  ScrollCheckDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ScrollCheckDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
2993
- ScrollCheckDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: ScrollCheckDirective, selector: "[vi-scroll-check]", inputs: { scrollLimit: ["vi-scroll-check", "scrollLimit"] }, outputs: { limitExceed: "limitExceed" }, usesInheritance: true, ngImport: i0 });
3022
+ ScrollCheckDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: ScrollCheckDirective, selector: "[vi-scroll-check]", inputs: { offset: "offset", scrollLimit: ["vi-scroll-check", "scrollLimit"] }, outputs: { top: "top", bottom: "bottom", limitExceed: "limitExceed" }, usesInheritance: true, ngImport: i0 });
2994
3023
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ScrollCheckDirective, decorators: [{
2995
3024
  type: Directive,
2996
3025
  args: [{
2997
3026
  selector: '[vi-scroll-check]'
2998
3027
  }]
2999
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { limitExceed: [{
3028
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { top: [{
3000
3029
  type: Output
3030
+ }], bottom: [{
3031
+ type: Output
3032
+ }], limitExceed: [{
3033
+ type: Output
3034
+ }], offset: [{
3035
+ type: Input
3001
3036
  }], scrollLimit: [{
3002
3037
  type: Input,
3003
3038
  args: ['vi-scroll-check']