import {Component, Directive, Optional, ElementRef, Renderer, TemplateRef, forwardRef, Inject, ViewContainerRef} from 'angular2/angular2'; import {Ion} from '../ion'; import {Icon} from '../icon/icon'; import {ToolbarBase} from '../toolbar/toolbar'; import {Config} from '../../config/config'; import {Page} from '../../config/decorators'; import {IonicApp} from '../app/app'; import {ViewController} from '../nav/view-controller'; import {NavController} from '../nav/nav-controller'; @Directive({ selector: '.back-button', host: { '(click)': 'goBack($event)' } }) class BackButton extends Ion { constructor( @Optional() navCtrl: NavController, elementRef: ElementRef, @Optional() @Inject(forwardRef(() => Navbar)) navbar: Navbar ) { super(elementRef, null); this.navCtrl = navCtrl; navbar && navbar.setBackButtonRef(elementRef); } goBack(ev) { ev.stopPropagation(); ev.preventDefault(); this.navCtrl && this.navCtrl.pop(); } } @Directive({ selector: '.back-button-text' }) class BackButtonText { constructor( elementRef: ElementRef, @Inject(forwardRef(() => Navbar)) navbar: Navbar ) { navbar.setBackButtonTextRef(elementRef); } } @Directive({ selector: '.toolbar-background' }) class ToolbarBackground { constructor( elementRef: ElementRef, @Inject(forwardRef(() => Navbar)) navbar: Navbar ) { navbar.setBackgroundRef(elementRef); } } @Component({ selector: 'ion-navbar', template: '
' + '' + '' + '' + '' + '
' + '' + '
', host: { '[hidden]': '_hidden', 'class': 'toolbar' }, inputs: [ 'hideBackButton' ], directives: [BackButton, BackButtonText, Icon, ToolbarBackground] }) export class Navbar extends ToolbarBase { constructor( app: IonicApp, @Optional() viewCtrl: ViewController, elementRef: ElementRef, config: Config, renderer: Renderer ) { super(elementRef, config); this.app = app; this.renderer = renderer; viewCtrl && viewCtrl.setNavbar(this); this.bbIcon = config.get('backButtonIcon'); this.bbText = config.get('backButtonText'); } /** * @private */ ngOnInit() { super.ngOnInit(); let hideBackButton = this.hideBackButton; if (typeof hideBackButton === 'string') { this.hideBackButton = (hideBackButton === '' || hideBackButton === 'true'); } } /** * @private */ getBackButtonRef() { return this.bbRef; } /** * @private */ setBackButtonRef(backButtonElementRef) { this.bbRef = backButtonElementRef; } /** * @private */ getBackButtonTextRef() { return this.bbtRef; } /** * @private */ setBackButtonTextRef(backButtonTextElementRef) { this.bbtRef = backButtonTextElementRef; } /** * @private */ setBackgroundRef(backgrouneElementRef) { this.bgRef = backgrouneElementRef; } /** * @private */ getBackgroundRef() { return this.bgRef; } /** * @private */ didEnter() { try { this.app.setTitle(this.getTitleText()); } catch(e) { console.error(e); } } /** * @private */ setHidden(isHidden) { this._hidden = isHidden } } /** * @private * Used to find and register headers in a view, and this directive's * content will be moved up to the common navbar location, and created * using the same context as the view's content area. */ @Directive({ selector: 'template[navbar]' }) export class NavbarTemplate { constructor( viewContainerRef: ViewContainerRef, templateRef: TemplateRef, @Optional() viewCtrl: ViewController ) { if (viewCtrl) { viewCtrl.setNavbarTemplateRef(templateRef); viewCtrl.setNavbarViewRef(viewContainerRef); } } }