8
8
9
9
import { PositionStrategy } from './position-strategy' ;
10
10
import { ElementRef } from '@angular/core' ;
11
- import { ViewportRuler , CdkScrollable , ViewportScrollPosition } from '@angular/cdk/scrolling' ;
11
+ import { ViewportRuler , CdkScrollable } from '@angular/cdk/scrolling' ;
12
12
import {
13
13
ConnectedOverlayPositionChange ,
14
14
ConnectionPositionPair ,
@@ -111,9 +111,6 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy {
111
111
/** Amount of subscribers to the `positionChanges` stream. */
112
112
private _positionChangeSubscriptions = 0 ;
113
113
114
- /** Amount by which the overlay was pushed in each axis during the last time it was positioned. */
115
- private _previousPushAmount : { x : number , y : number } | null ;
116
-
117
114
/** Observable sequence of position changes. */
118
115
positionChanges : Observable < ConnectedOverlayPositionChange > = Observable . create ( observer => {
119
116
const subscription = this . _positionChanges . subscribe ( observer ) ;
@@ -282,8 +279,6 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy {
282
279
}
283
280
284
281
detach ( ) {
285
- this . _lastPosition = null ;
286
- this . _previousPushAmount = null ;
287
282
this . _resizeSubscription . unsubscribe ( ) ;
288
283
}
289
284
@@ -543,55 +538,39 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy {
543
538
* the viewport, the top-left corner will be pushed on-screen (with overflow occuring on the
544
539
* right and bottom).
545
540
*
546
- * @param start Starting point from which the overlay is pushed.
547
- * @param overlay Dimensions of the overlay.
548
- * @param scrollPosition Current viewport scroll position.
541
+ * @param start The starting point from which the overlay is pushed.
542
+ * @param overlay The overlay dimensions.
549
543
* @returns The point at which to position the overlay after pushing. This is effectively a new
550
544
* originPoint.
551
545
*/
552
- private _pushOverlayOnScreen ( start : Point ,
553
- overlay : ClientRect ,
554
- scrollPosition : ViewportScrollPosition ) : Point {
555
- // If the position is locked and we've pushed the overlay already, reuse the previous push
556
- // amount, rather than pushing it again. If we were to continue pushing, the element would
557
- // remain in the viewport, which goes against the expectations when position locking is enabled.
558
- if ( this . _previousPushAmount && this . _positionLocked ) {
559
- return {
560
- x : start . x + this . _previousPushAmount . x ,
561
- y : start . y + this . _previousPushAmount . y
562
- } ;
563
- }
564
-
546
+ private _pushOverlayOnScreen ( start : Point , overlay : ClientRect ) : Point {
565
547
const viewport = this . _viewportRect ;
566
548
567
- // Determine how much the overlay goes outside the viewport on each
568
- // side, which we'll use to decide which direction to push it.
549
+ // Determine how much the overlay goes outside the viewport on each side, which we'll use to
550
+ // decide which direction to push it.
569
551
const overflowRight = Math . max ( start . x + overlay . width - viewport . right , 0 ) ;
570
552
const overflowBottom = Math . max ( start . y + overlay . height - viewport . bottom , 0 ) ;
571
- const overflowTop = Math . max ( viewport . top - scrollPosition . top - start . y , 0 ) ;
572
- const overflowLeft = Math . max ( viewport . left - scrollPosition . left - start . x , 0 ) ;
553
+ const overflowTop = Math . max ( viewport . top - start . y , 0 ) ;
554
+ const overflowLeft = Math . max ( viewport . left - start . x , 0 ) ;
573
555
574
- // Amount by which to push the overlay in each axis such that it remains on-screen.
575
- let pushX = 0 ;
576
- let pushY = 0 ;
556
+ // Amount by which to push the overlay in each direction such that it remains on-screen.
557
+ let pushX , pushY = 0 ;
577
558
578
559
// If the overlay fits completely within the bounds of the viewport, push it from whichever
579
560
// direction is goes off-screen. Otherwise, push the top-left corner such that its in the
580
561
// viewport and allow for the trailing end of the overlay to go out of bounds.
581
- if ( overlay . width < viewport . width ) {
562
+ if ( overlay . width <= viewport . width ) {
582
563
pushX = overflowLeft || - overflowRight ;
583
564
} else {
584
- pushX = start . x < this . _viewportMargin ? ( viewport . left - scrollPosition . left ) - start . x : 0 ;
565
+ pushX = viewport . left - start . x ;
585
566
}
586
567
587
- if ( overlay . height < viewport . height ) {
568
+ if ( overlay . height <= viewport . height ) {
588
569
pushY = overflowTop || - overflowBottom ;
589
570
} else {
590
- pushY = start . y < this . _viewportMargin ? ( viewport . top - scrollPosition . top ) - start . y : 0 ;
571
+ pushY = viewport . top - start . y ;
591
572
}
592
573
593
- this . _previousPushAmount = { x : pushX , y : pushY } ;
594
-
595
574
return {
596
575
x : start . x + pushX ,
597
576
y : start . y + pushY ,
@@ -810,9 +789,8 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy {
810
789
const styles = { } as CSSStyleDeclaration ;
811
790
812
791
if ( this . _hasExactPosition ( ) ) {
813
- const scrollPosition = this . _viewportRuler . getViewportScrollPosition ( ) ;
814
- extendStyles ( styles , this . _getExactOverlayY ( position , originPoint , scrollPosition ) ) ;
815
- extendStyles ( styles , this . _getExactOverlayX ( position , originPoint , scrollPosition ) ) ;
792
+ extendStyles ( styles , this . _getExactOverlayY ( position , originPoint ) ) ;
793
+ extendStyles ( styles , this . _getExactOverlayX ( position , originPoint ) ) ;
816
794
} else {
817
795
styles . position = 'static' ;
818
796
}
@@ -851,16 +829,14 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy {
851
829
}
852
830
853
831
/** Gets the exact top/bottom for the overlay when not using flexible sizing or when pushing. */
854
- private _getExactOverlayY ( position : ConnectedPosition ,
855
- originPoint : Point ,
856
- scrollPosition : ViewportScrollPosition ) {
832
+ private _getExactOverlayY ( position : ConnectedPosition , originPoint : Point ) {
857
833
// Reset any existing styles. This is necessary in case the
858
834
// preferred position has changed since the last `apply`.
859
835
let styles = { top : null , bottom : null } as CSSStyleDeclaration ;
860
836
let overlayPoint = this . _getOverlayPoint ( originPoint , this . _overlayRect , position ) ;
861
837
862
838
if ( this . _isPushed ) {
863
- overlayPoint = this . _pushOverlayOnScreen ( overlayPoint , this . _overlayRect , scrollPosition ) ;
839
+ overlayPoint = this . _pushOverlayOnScreen ( overlayPoint , this . _overlayRect ) ;
864
840
}
865
841
866
842
// We want to set either `top` or `bottom` based on whether the overlay wants to appear
@@ -878,16 +854,14 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy {
878
854
}
879
855
880
856
/** Gets the exact left/right for the overlay when not using flexible sizing or when pushing. */
881
- private _getExactOverlayX ( position : ConnectedPosition ,
882
- originPoint : Point ,
883
- scrollPosition : ViewportScrollPosition ) {
857
+ private _getExactOverlayX ( position : ConnectedPosition , originPoint : Point ) {
884
858
// Reset any existing styles. This is necessary in case the preferred position has
885
859
// changed since the last `apply`.
886
860
let styles = { left : null , right : null } as CSSStyleDeclaration ;
887
861
let overlayPoint = this . _getOverlayPoint ( originPoint , this . _overlayRect , position ) ;
888
862
889
863
if ( this . _isPushed ) {
890
- overlayPoint = this . _pushOverlayOnScreen ( overlayPoint , this . _overlayRect , scrollPosition ) ;
864
+ overlayPoint = this . _pushOverlayOnScreen ( overlayPoint , this . _overlayRect ) ;
891
865
}
892
866
893
867
// We want to set either `left` or `right` based on whether the overlay wants to appear "before"
0 commit comments