Skip to content

Commit 482f8ed

Browse files
committed
feat(scrollpoints): react on scrollpoints
1 parent 507e1ca commit 482f8ed

File tree

3 files changed

+45
-39
lines changed

3 files changed

+45
-39
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import {Inject, Injectable} from '@angular/core';
2+
import {DOCUMENT} from '@angular/common';
3+
4+
export interface ScrollPoints {
5+
top?: number;
6+
bottom?: number;
7+
}
8+
9+
@Injectable({
10+
providedIn: 'root'
11+
})
12+
export class ScrollHelperService {
13+
14+
private window: WindowProxy;
15+
private DEFAULT_SCROLLSPEED = 50;
16+
17+
constructor(@Inject(DOCUMENT) private document) {
18+
this.window = document.defaultView;
19+
}
20+
21+
public scrollIfNecessary(element: HTMLElement, scrollPoints: ScrollPoints = {}, scrollSpeed?: number): void {
22+
const bounding = element.getBoundingClientRect();
23+
if (this.isTopScrollNeeded(bounding.top, scrollPoints.top)) {
24+
this.window.scrollBy({top: -scrollSpeed || -this.DEFAULT_SCROLLSPEED, behavior: 'smooth'});
25+
return;
26+
}
27+
28+
if (this.isBottomScrollNeeded(bounding.top, scrollPoints.bottom)) {
29+
this.window.scrollBy({top: scrollSpeed || this.DEFAULT_SCROLLSPEED, behavior: 'smooth'});
30+
}
31+
}
32+
33+
private isTopScrollNeeded(topBounding: number, scrollPointTop: number): boolean {
34+
return scrollPointTop ? topBounding < scrollPointTop : topBounding < 0;
35+
}
36+
37+
private isBottomScrollNeeded(bottomBounding: number, scrollPointBottom: number): boolean {
38+
return scrollPointBottom ? bottomBounding < scrollPointBottom : bottomBounding > this.window.innerHeight;
39+
}
40+
}

projects/ng-sortgrid/src/lib/helpers/view-port.service.ts

Lines changed: 0 additions & 28 deletions
This file was deleted.

projects/ng-sortgrid/src/lib/ngsg-item.directive.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,22 @@ import {NgsgStoreService} from './ngsg-store.service';
1717
import {NgsgSortService} from './ngsg-sort.service';
1818
import {NgsgSelectionService} from './ngsg-selection.service';
1919
import {NgsgEventsService} from './ngsg-events.service';
20+
import {ScrollHelperService} from './helpers/scroll-helper.service';
2021
import {Subject} from 'rxjs';
2122
import {takeUntil} from 'rxjs/operators';
22-
import {ViewPortService} from './helpers/view-port.service';
2323

2424
const selector = '[ngSortgridItem]';
2525

2626
@Directive({selector})
2727
export class NgsgItemDirective implements OnInit, OnChanges, AfterViewInit, OnDestroy {
2828
@Input() ngSortGridGroup = 'defaultGroup';
2929
@Input() ngSortGridItems;
30+
@Input() scrollPointTop;
31+
@Input() scrollSpeed;
3032

3133
@Output() sorted = new EventEmitter<any>();
3234

3335
private selected = false;
34-
private SCROLLSPEED = 100;
3536
private destroy$ = new Subject();
3637

3738
constructor(
@@ -41,7 +42,7 @@ export class NgsgItemDirective implements OnInit, OnChanges, AfterViewInit, OnDe
4142
private reflectService: NgsgReflectService,
4243
private ngsgStore: NgsgStoreService,
4344
private ngsgEventService: NgsgEventsService,
44-
private viewPortService: ViewPortService
45+
private scrollHelperService: ScrollHelperService
4546
) {
4647
}
4748

@@ -90,14 +91,7 @@ export class NgsgItemDirective implements OnInit, OnChanges, AfterViewInit, OnDe
9091

9192
@HostListener('dragover', ['$event'])
9293
dragOver(event): boolean {
93-
94-
if (this.viewPortService.isOutOfViewport(event.target).top) {
95-
window.scrollBy({top: -this.SCROLLSPEED, behavior: 'smooth'});
96-
}
97-
98-
if (this.viewPortService.isOutOfViewport(event.target).bottom) {
99-
window.scrollBy({top: this.SCROLLSPEED, behavior: 'smooth'});
100-
}
94+
this.scrollHelperService.scrollIfNecessary(event.target, {top: this.scrollPointTop}, this.scrollSpeed);
10195

10296
if (event.preventDefault) {
10397
// Necessary. Allows us to drop.

0 commit comments

Comments
 (0)