From fc78a3d753cf526a8589a489fccf90d08f5c094e Mon Sep 17 00:00:00 2001 From: crisbeto Date: Wed, 6 Jun 2018 21:13:48 +0200 Subject: [PATCH] refactor(overlay): avoid circular type references Currently there is a circular type reference between `OverlayRef`, `PositionStrategy`/`ScrollStrategy` and `OverlayConfig` which can cause issues with some build tools. These changes introduce the `OverlayRefBase` type to avoid the circular reference. Fixes #9491. --- src/cdk/overlay/overlay-reference.ts | 29 +++++++++++++++++++ .../position/connected-position-strategy.ts | 7 ++--- .../flexible-connected-position-strategy.ts | 6 ++-- .../position/global-position-strategy.ts | 6 ++-- src/cdk/overlay/position/position-strategy.ts | 5 ++-- .../overlay/scroll/close-scroll-strategy.ts | 6 ++-- .../scroll/reposition-scroll-strategy.ts | 6 ++-- src/cdk/overlay/scroll/scroll-strategy.ts | 4 +-- 8 files changed, 48 insertions(+), 21 deletions(-) create mode 100644 src/cdk/overlay/overlay-reference.ts diff --git a/src/cdk/overlay/overlay-reference.ts b/src/cdk/overlay/overlay-reference.ts new file mode 100644 index 000000000000..f7c871f2da21 --- /dev/null +++ b/src/cdk/overlay/overlay-reference.ts @@ -0,0 +1,29 @@ +/** + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {Portal} from '@angular/cdk/portal'; +import {Direction, Directionality} from '@angular/cdk/bidi'; + +/** + * Basic interface for an overlay. Used to avoid circular type references between + * `OverlayRef`, `PositionStrategy` and `ScrollStrategy`, and `OverlayConfig`. + * @docs-private + */ +export interface OverlayReference { + attach: (portal: Portal) => any; + detach: () => any; + dispose: () => void; + overlayElement: HTMLElement; + hostElement: HTMLElement; + getConfig: () => any; + hasAttached: () => boolean; + updateSize: (config: any) => void; + updatePosition: () => void; + getDirection: () => Direction; + setDirection: (dir: Direction | Directionality) => void; +} diff --git a/src/cdk/overlay/position/connected-position-strategy.ts b/src/cdk/overlay/position/connected-position-strategy.ts index c2cafa2f987a..4fa8931f6e39 100644 --- a/src/cdk/overlay/position/connected-position-strategy.ts +++ b/src/cdk/overlay/position/connected-position-strategy.ts @@ -10,7 +10,6 @@ import {Direction} from '@angular/cdk/bidi'; import {CdkScrollable, ViewportRuler} from '@angular/cdk/scrolling'; import {ElementRef} from '@angular/core'; import {Observable} from 'rxjs'; -import {OverlayRef} from '../overlay-ref'; import { ConnectedOverlayPositionChange, ConnectionPositionPair, @@ -20,7 +19,7 @@ import { import {FlexibleConnectedPositionStrategy} from './flexible-connected-position-strategy'; import {PositionStrategy} from './position-strategy'; import {Platform} from '@angular/cdk/platform'; - +import {OverlayReference} from '../overlay-reference'; /** * A strategy for positioning overlays. Using this strategy, an overlay is given an @@ -39,7 +38,7 @@ export class ConnectedPositionStrategy implements PositionStrategy { _positionStrategy: FlexibleConnectedPositionStrategy; /** The overlay to which this strategy is attached. */ - private _overlayRef: OverlayRef; + private _overlayRef: OverlayReference; private _direction: Direction | null; @@ -84,7 +83,7 @@ export class ConnectedPositionStrategy implements PositionStrategy { } /** Attach this position strategy to an overlay. */ - attach(overlayRef: OverlayRef): void { + attach(overlayRef: OverlayReference): void { this._overlayRef = overlayRef; this._positionStrategy.attach(overlayRef); diff --git a/src/cdk/overlay/position/flexible-connected-position-strategy.ts b/src/cdk/overlay/position/flexible-connected-position-strategy.ts index 237c5aa59cf3..1910f655e652 100644 --- a/src/cdk/overlay/position/flexible-connected-position-strategy.ts +++ b/src/cdk/overlay/position/flexible-connected-position-strategy.ts @@ -17,7 +17,7 @@ import { validateVerticalPosition, } from './connected-position'; import {Observable, Subscription, Subject} from 'rxjs'; -import {OverlayRef} from '../overlay-ref'; +import {OverlayReference} from '../overlay-reference'; import {isElementScrolledOutsideView, isElementClippedByScrolling} from './scroll-clip'; import {coerceCssPixelValue} from '@angular/cdk/coercion'; import {Platform} from '@angular/cdk/platform'; @@ -34,7 +34,7 @@ import {Platform} from '@angular/cdk/platform'; */ export class FlexibleConnectedPositionStrategy implements PositionStrategy { /** The overlay to which this strategy is attached. */ - private _overlayRef: OverlayRef; + private _overlayRef: OverlayReference; /** Whether we're performing the very first positioning of the overlay. */ private _isInitialRender = true; @@ -137,7 +137,7 @@ export class FlexibleConnectedPositionStrategy implements PositionStrategy { } /** Attaches this position strategy to an overlay. */ - attach(overlayRef: OverlayRef): void { + attach(overlayRef: OverlayReference): void { if (this._overlayRef && overlayRef !== this._overlayRef) { throw Error('This position strategy is already attached to an overlay'); } diff --git a/src/cdk/overlay/position/global-position-strategy.ts b/src/cdk/overlay/position/global-position-strategy.ts index 04a39649960c..e25019e5e5b6 100644 --- a/src/cdk/overlay/position/global-position-strategy.ts +++ b/src/cdk/overlay/position/global-position-strategy.ts @@ -7,7 +7,7 @@ */ import {PositionStrategy} from './position-strategy'; -import {OverlayRef} from '../overlay-ref'; +import {OverlayReference} from '../overlay-reference'; /** @@ -18,7 +18,7 @@ import {OverlayRef} from '../overlay-ref'; */ export class GlobalPositionStrategy implements PositionStrategy { /** The overlay to which this strategy is attached. */ - private _overlayRef: OverlayRef; + private _overlayRef: OverlayReference; private _cssPosition: string = 'static'; private _topOffset: string = ''; private _bottomOffset: string = ''; @@ -29,7 +29,7 @@ export class GlobalPositionStrategy implements PositionStrategy { private _width: string = ''; private _height: string = ''; - attach(overlayRef: OverlayRef): void { + attach(overlayRef: OverlayReference): void { const config = overlayRef.getConfig(); this._overlayRef = overlayRef; diff --git a/src/cdk/overlay/position/position-strategy.ts b/src/cdk/overlay/position/position-strategy.ts index 4237f8b8cc6c..a32c68872094 100644 --- a/src/cdk/overlay/position/position-strategy.ts +++ b/src/cdk/overlay/position/position-strategy.ts @@ -6,13 +6,12 @@ * found in the LICENSE file at https://angular.io/license */ -import {OverlayRef} from '../overlay-ref'; - +import {OverlayReference} from '../overlay-reference'; /** Strategy for setting the position on an overlay. */ export interface PositionStrategy { /** Attaches this position strategy to an overlay. */ - attach(overlayRef: OverlayRef): void; + attach(overlayRef: OverlayReference): void; /** Updates the position of the overlay element. */ apply(): void; diff --git a/src/cdk/overlay/scroll/close-scroll-strategy.ts b/src/cdk/overlay/scroll/close-scroll-strategy.ts index d42e7f1ae969..c1d77dfb8c1b 100644 --- a/src/cdk/overlay/scroll/close-scroll-strategy.ts +++ b/src/cdk/overlay/scroll/close-scroll-strategy.ts @@ -7,7 +7,7 @@ */ import {NgZone} from '@angular/core'; import {ScrollStrategy, getMatScrollStrategyAlreadyAttachedError} from './scroll-strategy'; -import {OverlayRef} from '../overlay-ref'; +import {OverlayReference} from '../overlay-reference'; import {Subscription} from 'rxjs'; import {ScrollDispatcher, ViewportRuler} from '@angular/cdk/scrolling'; @@ -24,7 +24,7 @@ export interface CloseScrollStrategyConfig { */ export class CloseScrollStrategy implements ScrollStrategy { private _scrollSubscription: Subscription|null = null; - private _overlayRef: OverlayRef; + private _overlayRef: OverlayReference; private _initialScrollPosition: number; constructor( @@ -34,7 +34,7 @@ export class CloseScrollStrategy implements ScrollStrategy { private _config?: CloseScrollStrategyConfig) {} /** Attaches this scroll strategy to an overlay. */ - attach(overlayRef: OverlayRef) { + attach(overlayRef: OverlayReference) { if (this._overlayRef) { throw getMatScrollStrategyAlreadyAttachedError(); } diff --git a/src/cdk/overlay/scroll/reposition-scroll-strategy.ts b/src/cdk/overlay/scroll/reposition-scroll-strategy.ts index ea086bba7786..fc5f8f7b674d 100644 --- a/src/cdk/overlay/scroll/reposition-scroll-strategy.ts +++ b/src/cdk/overlay/scroll/reposition-scroll-strategy.ts @@ -9,7 +9,7 @@ import {NgZone} from '@angular/core'; import {Subscription} from 'rxjs'; import {ScrollStrategy, getMatScrollStrategyAlreadyAttachedError} from './scroll-strategy'; -import {OverlayRef} from '../overlay-ref'; +import {OverlayReference} from '../overlay-reference'; import {ScrollDispatcher, ViewportRuler} from '@angular/cdk/scrolling'; import {isElementScrolledOutsideView} from '../position/scroll-clip'; @@ -29,7 +29,7 @@ export interface RepositionScrollStrategyConfig { */ export class RepositionScrollStrategy implements ScrollStrategy { private _scrollSubscription: Subscription|null = null; - private _overlayRef: OverlayRef; + private _overlayRef: OverlayReference; constructor( private _scrollDispatcher: ScrollDispatcher, @@ -38,7 +38,7 @@ export class RepositionScrollStrategy implements ScrollStrategy { private _config?: RepositionScrollStrategyConfig) { } /** Attaches this scroll strategy to an overlay. */ - attach(overlayRef: OverlayRef) { + attach(overlayRef: OverlayReference) { if (this._overlayRef) { throw getMatScrollStrategyAlreadyAttachedError(); } diff --git a/src/cdk/overlay/scroll/scroll-strategy.ts b/src/cdk/overlay/scroll/scroll-strategy.ts index f96d94522773..8d60f2539d0f 100644 --- a/src/cdk/overlay/scroll/scroll-strategy.ts +++ b/src/cdk/overlay/scroll/scroll-strategy.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {OverlayRef} from '../overlay-ref'; +import {OverlayReference} from '../overlay-reference'; /** * Describes a strategy that will be used by an overlay to handle scroll events while it is open. @@ -19,7 +19,7 @@ export interface ScrollStrategy { disable: () => void; /** Attaches this `ScrollStrategy` to an overlay. */ - attach: (overlayRef: OverlayRef) => void; + attach: (overlayRef: OverlayReference) => void; } /**