Skip to content

Commit db72a7d

Browse files
manucorporatadamdbradley
authored andcommitted
fix(menu): menu's content is resized properly
fixes #8504
1 parent bcbe03c commit db72a7d

File tree

7 files changed

+75
-42
lines changed

7 files changed

+75
-42
lines changed

src/components/backdrop/backdrop.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Directive, ElementRef, Input } from '@angular/core';
1+
import { Directive, ElementRef, Input, Renderer } from '@angular/core';
22

33
import { GestureController } from '../../gestures/gesture-controller';
44
import { isTrueProperty } from '../../util/util';
@@ -19,7 +19,10 @@ export class Backdrop {
1919
private _gestureID: number = null;
2020
@Input() disableScroll = true;
2121

22-
constructor(private _gestureCtrl: GestureController, private _elementRef: ElementRef) {}
22+
constructor(
23+
private _gestureCtrl: GestureController,
24+
private _elementRef: ElementRef,
25+
private _renderer: Renderer) { }
2326

2427
ngOnInit() {
2528
if (isTrueProperty(this.disableScroll)) {
@@ -38,4 +41,8 @@ export class Backdrop {
3841
return this._elementRef.nativeElement;
3942
}
4043

44+
setElementClass(className: string, add: boolean) {
45+
this._renderer.setElementClass(this._elementRef.nativeElement, className, add);
46+
}
47+
4148
}

src/components/content/content.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,9 @@ export class Content extends Ion {
488488
this._tabsPlacement = null;
489489

490490
let ele: HTMLElement = this._elementRef.nativeElement;
491-
if (!ele) return;
491+
if (!ele) {
492+
return;
493+
}
492494

493495
let parentEle: HTMLElement = ele.parentElement;
494496
let computedStyle: any;

src/components/menu/menu.scss

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@ ion-menu.show-menu {
2929
bottom: 0;
3030
left: 0;
3131

32-
display: flex;
33-
34-
flex-direction: column;
32+
display: block;
3533

3634
width: $menu-width;
3735

@@ -41,7 +39,7 @@ ion-menu.show-menu {
4139
.menu-inner > ion-header,
4240
.menu-inner > ion-content,
4341
.menu-inner > ion-footer {
44-
position: relative;
42+
position: absolute;
4543
}
4644

4745
ion-menu[side=right] > .menu-inner {

src/components/menu/menu.ts

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, NgZone, Output, Renderer, ViewChild, ViewEncapsulation } from '@angular/core';
1+
import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EventEmitter, Input, NgZone, Output, Renderer, ViewChild, ViewEncapsulation } from '@angular/core';
22

33
import { Backdrop } from '../backdrop/backdrop';
44
import { Config } from '../../config/config';
@@ -10,7 +10,7 @@ import { MenuType } from './menu-types';
1010
import { Platform } from '../../platform/platform';
1111
import { GestureController } from '../../gestures/gesture-controller';
1212
import { UIEventManager } from '../../util/ui-event-manager';
13-
13+
import { Content } from '../content/content';
1414

1515
/**
1616
* @name Menu
@@ -208,6 +208,11 @@ export class Menu {
208208
*/
209209
@ViewChild(Backdrop) backdrop: Backdrop;
210210

211+
/**
212+
* @private
213+
*/
214+
@ContentChild(Content) menuContent: Content;
215+
211216
/**
212217
* @input {any} A reference to the content element the menu should use.
213218
*/
@@ -303,48 +308,47 @@ export class Menu {
303308
* @private
304309
*/
305310
ngOnInit() {
306-
let self = this;
307-
self._init = true;
311+
this._init = true;
308312

309-
let content = self.content;
310-
self._cntEle = (content instanceof Node) ? content : content && content.getNativeElement && content.getNativeElement();
313+
let content = this.content;
314+
this._cntEle = (content instanceof Node) ? content : content && content.getNativeElement && content.getNativeElement();
311315

312316
// requires content element
313-
if (!self._cntEle) {
317+
if (!this._cntEle) {
314318
return console.error('Menu: must have a [content] element to listen for drag events on. Example:\n\n<ion-menu [content]="content"></ion-menu>\n\n<ion-nav #content></ion-nav>');
315319
}
316320

317321
// normalize the "side"
318-
if (self.side !== 'left' && self.side !== 'right') {
319-
self.side = 'left';
322+
if (this.side !== 'left' && this.side !== 'right') {
323+
this.side = 'left';
320324
}
321-
self._renderer.setElementAttribute(self._elementRef.nativeElement, 'side', self.side);
325+
this.setElementAttribute('side', this.side);
322326

323327
// normalize the "type"
324-
if (!self.type) {
325-
self.type = self._config.get('menuType');
328+
if (!this.type) {
329+
this.type = this._config.get('menuType');
326330
}
327-
self._renderer.setElementAttribute(self._elementRef.nativeElement, 'type', self.type);
331+
this.setElementAttribute('type', this.type);
328332

329333
// add the gestures
330-
self._cntGesture = new MenuContentGesture(self, document.body);
334+
this._cntGesture = new MenuContentGesture(this, document.body);
331335

332336
// register listeners if this menu is enabled
333337
// check if more than one menu is on the same side
334-
let hasEnabledSameSideMenu = self._menuCtrl.getMenus().some(m => {
335-
return m.side === self.side && m.enabled;
338+
let hasEnabledSameSideMenu = this._menuCtrl.getMenus().some(m => {
339+
return m.side === this.side && m.enabled;
336340
});
337341
if (hasEnabledSameSideMenu) {
338342
// auto-disable if another menu on the same side is already enabled
339-
self._isEnabled = false;
343+
this._isEnabled = false;
340344
}
341-
self._setListeners();
345+
this._setListeners();
342346

343-
self._cntEle.classList.add('menu-content');
344-
self._cntEle.classList.add('menu-content-' + self.type);
347+
this._cntEle.classList.add('menu-content');
348+
this._cntEle.classList.add('menu-content-' + this.type);
345349

346350
// register this menu with the app's menu controller
347-
self._menuCtrl.register(self);
351+
this._menuCtrl.register(this);
348352
}
349353

350354
/**
@@ -468,8 +472,9 @@ export class Menu {
468472
private _before() {
469473
// this places the menu into the correct location before it animates in
470474
// this css class doesn't actually kick off any animations
471-
this.getNativeElement().classList.add('show-menu');
472-
this.getBackdropElement().classList.add('show-backdrop');
475+
this.menuContent && this.menuContent.resize();
476+
this.setElementClass('show-menu', true);
477+
this.backdrop.setElementClass('show-backdrop', true);
473478
this._keyboard.close();
474479
this._isAnimating = true;
475480
}
@@ -482,11 +487,10 @@ export class Menu {
482487
this.isOpen = isOpen;
483488
this._isAnimating = false;
484489

485-
(<any>this._cntEle.classList)[isOpen ? 'add' : 'remove']('menu-content-open');
486-
487490
this._events.unlistenAll();
488-
489491
if (isOpen) {
492+
this._cntEle.classList.add('menu-content-open');
493+
490494
let callback = this.onBackdropClick.bind(this);
491495
this._events.pointerEvents({
492496
element: this._cntEle,
@@ -499,8 +503,10 @@ export class Menu {
499503
this.ionOpen.emit(true);
500504

501505
} else {
502-
this.getNativeElement().classList.remove('show-menu');
503-
this.getBackdropElement().classList.remove('show-backdrop');
506+
this._cntEle.classList.remove('menu-content-open');
507+
this.setElementClass('show-menu', false);
508+
this.backdrop.setElementClass('show-menu', false);
509+
504510
this.ionClose.emit(true);
505511
}
506512
}
@@ -597,6 +603,17 @@ export class Menu {
597603
return this._menuCtrl;
598604
}
599605

606+
/**
607+
* @private
608+
*/
609+
setElementClass(className: string, add: boolean) {
610+
this._renderer.setElementClass(this._elementRef.nativeElement, className, add);
611+
}
612+
613+
setElementAttribute(attributeName: string, value: string) {
614+
this._renderer.setElementAttribute(this._elementRef.nativeElement, attributeName, value);
615+
}
616+
600617
/**
601618
* @private
602619
*/

src/components/menu/test/push/main.html

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
</ion-header>
88

99
<ion-content>
10-
1110
<ion-list>
1211

1312
<button ion-item menuToggle="left" detail-none>
@@ -18,6 +17,13 @@
1817
</button>
1918

2019
</ion-list>
20+
<p>Close Left Menu and Show alert buttons</p>
21+
22+
<div f></div>
23+
<div f></div>
24+
<div f></div>
25+
<div f></div>
26+
2127
</ion-content>
2228

2329
</ion-menu>
@@ -31,14 +37,20 @@
3137
</ion-header>
3238

3339
<ion-content>
34-
3540
<ion-list>
3641

3742
<button ion-item menuToggle="right" detail-none>
3843
Close Right Menu
3944
</button>
4045

4146
</ion-list>
47+
<p>Only one close button</p>
48+
49+
<div f></div>
50+
<div f></div>
51+
<div f></div>
52+
<div f></div>
53+
4254
</ion-content>
4355

4456
</ion-menu>

src/components/tabs/tabs.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import { Content } from '../content/content';
66
import { DeepLinker } from '../../navigation/deep-linker';
77
import { Ion } from '../ion';
88
import { isBlank } from '../../util/util';
9-
import { nativeRaf } from '../../util/dom';
109
import { NavController } from '../../navigation/nav-controller';
1110
import { NavControllerBase } from '../../navigation/nav-controller-base';
1211
import { NavOptions, DIRECTION_SWITCH } from '../../navigation/nav-util';
@@ -476,10 +475,7 @@ export class Tabs extends Ion implements AfterViewInit {
476475
if (alreadyLoaded && selectedPage) {
477476
let content = <Content>selectedPage.getContent();
478477
if (content && content instanceof Content) {
479-
nativeRaf(() => {
480-
content.readDimensions();
481-
content.writeDimensions();
482-
});
478+
content.resize();
483479
}
484480
}
485481
});

src/transitions/page-transition.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export class PageTransition extends Transition {
1414
this.enteringPage = new Animation(this.enteringView.pageRef());
1515
this.add(this.enteringPage.beforeAddClass('show-page'));
1616

17+
// Resize content before transition starts
1718
this.beforeAddRead(this.readDimensions.bind(this));
1819
this.beforeAddWrite(this.writeDimensions.bind(this));
1920
}

0 commit comments

Comments
 (0)