-
Notifications
You must be signed in to change notification settings - Fork 6.8k
feat(dialog): support minWidth, minHeight, maxWidth and maxHeight #7488
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
* Adds Dialog support for `minWidth`, `minHeight`, `maxWidth` and `maxHeight` via config. Mostly delegates to Overlay. * Moves declared `max-width` on `. mat-dialog-container` stylesheet to be authored via `MatDialogConfig`, providing the same default `80vw` value. Without this change, there would likely be undesired layout results due to different constraints being set on the overlay container vs the nested the dialog container. * Added note on `minHeight` and `maxHeight` regarding the potential need to also set a `height` due to the rules around computed height resolution (https://www.w3.org/TR/CSS2/visudet.html#min-max-widths). Any value set on `height` as a default would probably be assuming too much and may have varying results across browsers.
931c3be to
4473ec2
Compare
Not adding `minWidth`, `minHeight`, `maxWidth` and `maxHeight` to `config` to avoid overriding the default value of `maxWidth` particularly—the type checker will require it to be a string. Instead, setting `config` to type `MatDialogConfig` is prefered to appease the type checker since those four properties are optional.
9aa50df to
401e686
Compare
Appeases the AOT type checker for the template by extending `MatDialogConfig` to disallow `position` from being undefined, given that it’s optional. Guards cannot be set on the template because the values are bound to NgModel.
401e686 to
3582d14
Compare
|
Screenshot tests seem to be failing for components that—as far as I can tell—are unrelated to what this PR addresses. Screenshot test flagged: |
src/demo-app/dialog/dialog-demo.ts
Outdated
| } from '@angular/material'; | ||
|
|
||
| /** | ||
| * Appeases the AOT type checker for the template by extending `MatDialogConfig` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would rather not add a separate type just for the sake of AoT. You can remove the type from the config. It'll still be type-checked when it's passed in to dialog.open.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Correct, dialog.open would type-check, but not having type results in AOT errors because the template would only have the inferred type to go off from:
Error at /home/travis/build/angular/material2/dist/packages/demo-app/dialog/dialog-demo.ngfactory.ts:526:51: Property 'minWidth' does not exist on type '{ disableClose: boolean; panelClass: string; hasBackdrop: boolean; backdropClass: string; width: ...'.
See https://travis-ci.org/angular/material2/jobs/282614008.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can get it to play nice if you initialize the minWidth to something.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@crisbeto another alternative would be to just type with MatDialogConfig without extending, but given strictNullChecks, AOT will complain in the template about config.property possibly being undefined, so something like the below could be done. Let me know your thoughts.
<ng-template [ngIf]="config.position">
<p>
<mat-form-field>
<input matInput [(ngModel)]="config.position.top" (change)="config.position.bottom = ''" placeholder="Top">
</mat-form-field>
<mat-form-field>
<input matInput [(ngModel)]="config.position.bottom" (change)="config.position.top = ''" placeholder="Bottom">
</mat-form-field>
</p>
<p>
<mat-form-field>
<input matInput [(ngModel)]="config.position.left" (change)="config.position.right = ''" placeholder="Left">
</mat-form-field>
<mat-form-field>
<input matInput [(ngModel)]="config.position.right" (change)="config.position.left = ''" placeholder="Right">
</mat-form-field>
</p>
</ng-template>There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think that's over-complicating it. Initializing the new properties to empty strings should be fine.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Agreed re: initializing the config props. The only question I'd have is around setting the value for maxWidth since I'm initializing with 80vw on DialogConfig. Initializing it to something neutral like an empty string would override the value.
To your point about initializing, it could be as simple as initializing all min/max values with an empty string and initializing maxWidth with the 80vw, or extracting the default value out of a new DialogConfig and setting that in the maxWidth init.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Initializing all of them to an empty string (only in the demo) and the maxWidth to the same as the default is fine by me.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cool. Addressed in 2b1c733
src/lib/dialog/dialog-config.ts
Outdated
| /** | ||
| * Min-height of the dialog. | ||
| * For this value to be effectively applied, `height` may also need to be defined. | ||
| * See https://www.w3.org/TR/CSS2/visudet.html#min-max-widths |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think that this needs to link to the CSS spec. Something along the lines of /** min-height of the dialog */ should suffice. Same goes for the maxHeight.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
src/lib/dialog/dialog-config.ts
Outdated
| * For this value to be effectively applied, `height` may also need to be defined. | ||
| * See https://www.w3.org/TR/CSS2/visudet.html#min-max-widths | ||
| */ | ||
| minHeight?: string = ''; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These don't need to be initialized.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Addressed. What are your thoughts on initializing maxWidth? I left that initialized for the time being.
|
@crisbeto tests passing after your feedback with the same caveats regarding the screenshot tests noted above. Let me know if you have any further comments. |
crisbeto
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
src/lib/dialog/dialog-config.ts
Outdated
| maxWidth?: string = '80vw'; | ||
|
|
||
| /** Max-height of the dialog */ | ||
| maxHeight?: string; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These should all be string | number, where a number implies a pixel value to match the OverlayConfig values
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
src/lib/dialog/dialog-config.ts
Outdated
| /** Min-height of the dialog */ | ||
| minHeight?: string; | ||
|
|
||
| /** Max-width of the dialog. */ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This comment should include Defaults to 80vw
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
jelbourn
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
|
This issue has been automatically locked due to inactivity. Read more about our automatic conversation locking policy. This action has been performed automatically by a bot. |
Fixes #6024, Fixes #3209
minWidth,minHeight,maxWidthandmaxHeightvia config. Mostly delegates to Overlay.max-widthon.mat-dialog-containerstylesheet to be authored viaMatDialogConfig, providing the same default80vwvalue. Without this change, there would likely be undesired layout results due to different constraints being set on the overlay container vs the nested the dialog container.minHeightandmaxHeightregarding the potential need to also set aheightdue to the rules around computed height resolution (https://www.w3.org/TR/CSS2/visudet.html#min-max-widths). Any value set onheightas a default would probably be assuming too much and may have varying results across browsers.