diff --git a/src/lib/dialog/dialog-container.ts b/src/lib/dialog/dialog-container.ts index 415c6d31c1bb..0b35ac20c151 100644 --- a/src/lib/dialog/dialog-container.ts +++ b/src/lib/dialog/dialog-container.ts @@ -10,6 +10,7 @@ import { import {BasePortalHost, ComponentPortal, PortalHostDirective, TemplatePortal} from '../core'; import {MdDialogConfig} from './dialog-config'; import {MdDialogRef} from './dialog-ref'; +import {MD_DIALOG_CONTENT_SELECTOR} from './dialog-content-directives'; import {MdDialogContentAlreadyAttachedError} from './dialog-errors'; import {FocusTrap} from '../core/a11y/focus-trap'; import 'rxjs/add/operator/first'; @@ -61,6 +62,16 @@ export class MdDialogContainer extends BasePortalHost implements OnDestroy { } let attachResult = this._portalHost.attachComponentPortal(portal); + let componentElement = attachResult.location.nativeElement; + + // Add a class that we can use for styling the root element. + this._renderer.setElementClass(componentElement, 'md-dialog-root', true); + + // Add flexbox styling if the user is using the `md-dialog-content`. + if ('querySelector' in componentElement) { + this._renderer.setElementClass(componentElement, 'md-dialog-root-flex', + !!componentElement.querySelector(MD_DIALOG_CONTENT_SELECTOR)); + } // If were to attempt to focus immediately, then the content of the dialog would not yet be // ready in instances where change detection has to run first. To deal with this, we simply diff --git a/src/lib/dialog/dialog-content-directives.ts b/src/lib/dialog/dialog-content-directives.ts index 5f268182511b..65ae0186badc 100644 --- a/src/lib/dialog/dialog-content-directives.ts +++ b/src/lib/dialog/dialog-content-directives.ts @@ -1,6 +1,9 @@ import {Directive, Input} from '@angular/core'; import {MdDialogRef} from './dialog-ref'; +export const MD_DIALOG_CONTENT_SELECTOR = '[md-dialog-content], md-dialog-content' + + ', [mat-dialog-content], mat-dialog-content'; + /** * Button that will close the current dialog. @@ -33,7 +36,7 @@ export class MdDialogTitle { } * Scrollable content container of a dialog. */ @Directive({ - selector: '[md-dialog-content], md-dialog-content, [mat-dialog-content], mat-dialog-content' + selector: MD_DIALOG_CONTENT_SELECTOR }) export class MdDialogContent { } diff --git a/src/lib/dialog/dialog.scss b/src/lib/dialog/dialog.scss index b03cf9f85103..f04594297d46 100644 --- a/src/lib/dialog/dialog.scss +++ b/src/lib/dialog/dialog.scss @@ -5,7 +5,7 @@ $md-dialog-padding: 24px !default; $md-dialog-border-radius: 2px !default; $md-dialog-max-width: 80vw !default; -$md-dialog-max-height: 65vh !default; +$md-dialog-max-height: 80vh !default; md-dialog-container { @include md-elevation(24); @@ -15,7 +15,6 @@ md-dialog-container { border-radius: $md-dialog-border-radius; box-sizing: border-box; overflow: auto; - max-width: $md-dialog-max-width; // The dialog container should completely fill its parent overlay element. width: 100%; @@ -26,11 +25,20 @@ md-dialog-container { } } +.md-dialog-root { + max-height: calc(#{$md-dialog-max-height} - #{$md-dialog-padding * 2}); + max-width: $md-dialog-max-width; + + &.md-dialog-root-flex { + display: flex; + flex-flow: column; + } +} + md-dialog-content, [md-dialog-content], mat-dialog-content, [mat-dialog-content] { display: block; margin: 0 $md-dialog-padding * -1; padding: 0 $md-dialog-padding; - max-height: $md-dialog-max-height; overflow: auto; } diff --git a/src/lib/dialog/dialog.spec.ts b/src/lib/dialog/dialog.spec.ts index e4196924deaa..cf595ac3fe98 100644 --- a/src/lib/dialog/dialog.spec.ts +++ b/src/lib/dialog/dialog.spec.ts @@ -271,6 +271,23 @@ describe('MdDialog', () => { expect(overlayContainerElement.querySelectorAll('md-dialog-container').length).toBe(0); }); + it('should add a class for styling to the root element', () => { + dialog.open(PizzaMsg); + + let pizzaMsgContainer = overlayContainerElement.querySelector('pizza-msg'); + + expect(pizzaMsgContainer.classList).toContain('md-dialog-root'); + expect(pizzaMsgContainer.classList).not.toContain('md-dialog-root-flex'); + }); + + it('should add an extra flexbox class to components that use md-dialog-content', () => { + dialog.open(ContentElementDialog); + + let dialogContainer = overlayContainerElement.querySelector('content-element-dialog'); + + expect(dialogContainer.classList).toContain('md-dialog-root-flex'); + }); + describe('disableClose option', () => { it('should prevent closing via clicks on the backdrop', () => { dialog.open(PizzaMsg, { @@ -477,7 +494,10 @@ class ComponentWithChildViewContainer { } /** Simple component for testing ComponentPortal. */ -@Component({template: '
Pizza
'}) +@Component({ + template: 'Pizza
', + selector: 'pizza-msg' +}) class PizzaMsg { constructor(public dialogRef: MdDialogRef