88
99import { PositionStrategy } from './position-strategy' ;
1010import { ElementRef } from '@angular/core' ;
11- import { ViewportRuler , CdkScrollable , ViewportScrollPosition } from '@angular/cdk/scrolling' ;
11+ import { ViewportRuler , CdkScrollable } from '@angular/cdk/scrolling' ;
1212import {
1313 ConnectedOverlayPositionChange ,
1414 ConnectionPositionPair ,
@@ -111,9 +111,6 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy {
111111 /** Amount of subscribers to the `positionChanges` stream. */
112112 private _positionChangeSubscriptions = 0 ;
113113
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-
117114 /** Observable sequence of position changes. */
118115 positionChanges : Observable < ConnectedOverlayPositionChange > = Observable . create ( observer => {
119116 const subscription = this . _positionChanges . subscribe ( observer ) ;
@@ -282,8 +279,6 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy {
282279 }
283280
284281 detach ( ) {
285- this . _lastPosition = null ;
286- this . _previousPushAmount = null ;
287282 this . _resizeSubscription . unsubscribe ( ) ;
288283 }
289284
@@ -543,55 +538,39 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy {
543538 * the viewport, the top-left corner will be pushed on-screen (with overflow occuring on the
544539 * right and bottom).
545540 *
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.
549543 * @returns The point at which to position the overlay after pushing. This is effectively a new
550544 * originPoint.
551545 */
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 {
565547 const viewport = this . _viewportRect ;
566548
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.
569551 const overflowRight = Math . max ( start . x + overlay . width - viewport . right , 0 ) ;
570552 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 ) ;
573555
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 ;
577558
578559 // If the overlay fits completely within the bounds of the viewport, push it from whichever
579560 // direction is goes off-screen. Otherwise, push the top-left corner such that its in the
580561 // 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 ) {
582563 pushX = overflowLeft || - overflowRight ;
583564 } else {
584- pushX = start . x < this . _viewportMargin ? ( viewport . left - scrollPosition . left ) - start . x : 0 ;
565+ pushX = viewport . left - start . x ;
585566 }
586567
587- if ( overlay . height < viewport . height ) {
568+ if ( overlay . height <= viewport . height ) {
588569 pushY = overflowTop || - overflowBottom ;
589570 } else {
590- pushY = start . y < this . _viewportMargin ? ( viewport . top - scrollPosition . top ) - start . y : 0 ;
571+ pushY = viewport . top - start . y ;
591572 }
592573
593- this . _previousPushAmount = { x : pushX , y : pushY } ;
594-
595574 return {
596575 x : start . x + pushX ,
597576 y : start . y + pushY ,
@@ -810,9 +789,8 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy {
810789 const styles = { } as CSSStyleDeclaration ;
811790
812791 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 ) ) ;
816794 } else {
817795 styles . position = 'static' ;
818796 }
@@ -851,16 +829,14 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy {
851829 }
852830
853831 /** 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 ) {
857833 // Reset any existing styles. This is necessary in case the
858834 // preferred position has changed since the last `apply`.
859835 let styles = { top : null , bottom : null } as CSSStyleDeclaration ;
860836 let overlayPoint = this . _getOverlayPoint ( originPoint , this . _overlayRect , position ) ;
861837
862838 if ( this . _isPushed ) {
863- overlayPoint = this . _pushOverlayOnScreen ( overlayPoint , this . _overlayRect , scrollPosition ) ;
839+ overlayPoint = this . _pushOverlayOnScreen ( overlayPoint , this . _overlayRect ) ;
864840 }
865841
866842 // 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 {
878854 }
879855
880856 /** 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 ) {
884858 // Reset any existing styles. This is necessary in case the preferred position has
885859 // changed since the last `apply`.
886860 let styles = { left : null , right : null } as CSSStyleDeclaration ;
887861 let overlayPoint = this . _getOverlayPoint ( originPoint , this . _overlayRect , position ) ;
888862
889863 if ( this . _isPushed ) {
890- overlayPoint = this . _pushOverlayOnScreen ( overlayPoint , this . _overlayRect , scrollPosition ) ;
864+ overlayPoint = this . _pushOverlayOnScreen ( overlayPoint , this . _overlayRect ) ;
891865 }
892866
893867 // We want to set either `left` or `right` based on whether the overlay wants to appear "before"
0 commit comments