From 6cf3f15536b067037e13fe7f6231c0e880663230 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 4 Jan 2018 23:53:03 +0200 Subject: [PATCH] feat(dialog): allow for single dialog scroll strategy to be overwritten (#8726) Currently we have the `MAT_DIALOG_SCROLL_STRATEGY` token which allows consumers to specify the scroll strategy for all dialogs, however there's no way do so for a single dialog. These changes add an extra property to the dialog config that allow for the scroll strategy to be set. Fixes #8706. --- src/lib/dialog/dialog-config.ts | 4 ++++ src/lib/dialog/dialog.spec.ts | 13 ++++++++++++- src/lib/dialog/dialog.ts | 5 ++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/lib/dialog/dialog-config.ts b/src/lib/dialog/dialog-config.ts index 79d898938f8c..3a14b8daa879 100644 --- a/src/lib/dialog/dialog-config.ts +++ b/src/lib/dialog/dialog-config.ts @@ -8,6 +8,7 @@ import {ViewContainerRef} from '@angular/core'; import {Direction} from '@angular/cdk/bidi'; +import {ScrollStrategy} from '@angular/cdk/overlay'; /** Valid ARIA roles for a dialog element. */ export type DialogRole = 'dialog' | 'alertdialog'; @@ -94,5 +95,8 @@ export class MatDialogConfig { /** Whether the dialog should focus the first focusable element on open. */ autoFocus?: boolean = true; + /** Scroll strategy to be used for the dialog. */ + scrollStrategy?: ScrollStrategy; + // TODO(jelbourn): add configuration for lifecycle hooks, ARIA labelling. } diff --git a/src/lib/dialog/dialog.spec.ts b/src/lib/dialog/dialog.spec.ts index 4f7ae2285f61..7265e483db0c 100644 --- a/src/lib/dialog/dialog.spec.ts +++ b/src/lib/dialog/dialog.spec.ts @@ -24,7 +24,7 @@ import {Location} from '@angular/common'; import {SpyLocation} from '@angular/common/testing'; import {Directionality} from '@angular/cdk/bidi'; import {MatDialogContainer} from './dialog-container'; -import {OverlayContainer} from '@angular/cdk/overlay'; +import {OverlayContainer, ScrollStrategy} from '@angular/cdk/overlay'; import {A, ESCAPE} from '@angular/cdk/keycodes'; import {dispatchKeyboardEvent} from '@angular/cdk/testing'; import { @@ -605,6 +605,17 @@ describe('MatDialog', () => { expect(spy).toHaveBeenCalled(); })); + it('should be able to attach a custom scroll strategy', fakeAsync(() => { + const scrollStrategy: ScrollStrategy = { + attach: () => {}, + enable: jasmine.createSpy('scroll strategy enable spy'), + disable: () => {} + }; + + dialog.open(PizzaMsg, {scrollStrategy}); + expect(scrollStrategy.enable).toHaveBeenCalled(); + })); + describe('passing in data', () => { it('should be able to pass in data', () => { let config = { diff --git a/src/lib/dialog/dialog.ts b/src/lib/dialog/dialog.ts index 61de6c6f55db..ed72c21e568c 100644 --- a/src/lib/dialog/dialog.ts +++ b/src/lib/dialog/dialog.ts @@ -8,7 +8,6 @@ import {Directionality} from '@angular/cdk/bidi'; import { - BlockScrollStrategy, Overlay, OverlayConfig, OverlayRef, @@ -49,7 +48,7 @@ export const MAT_DIALOG_SCROLL_STRATEGY = /** @docs-private */ export function MAT_DIALOG_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay: Overlay): - () => BlockScrollStrategy { + () => ScrollStrategy { return () => overlay.scrollStrategies.block(); } @@ -185,7 +184,7 @@ export class MatDialog { private _getOverlayConfig(dialogConfig: MatDialogConfig): OverlayConfig { const state = new OverlayConfig({ positionStrategy: this._overlay.position().global(), - scrollStrategy: this._scrollStrategy(), + scrollStrategy: dialogConfig.scrollStrategy || this._scrollStrategy(), panelClass: dialogConfig.panelClass, hasBackdrop: dialogConfig.hasBackdrop, direction: dialogConfig.direction,