import {Component, Directive, Host, ElementRef, Optional, forwardRef, Inject, ContentChildren, ContentChild, QueryList} from 'angular2/core'; import {Ion} from '../ion'; import {Config} from '../../config/config'; import {MenuToggle} from '../menu/menu-toggle'; import {Navbar} from '../navbar/navbar'; import {Button} from '../button/button'; /** * @private */ export class ToolbarBase extends Ion { constructor( elementRef: ElementRef, config: Config ) { super(elementRef, config); this.itemRefs = []; this.titleRef = null; } /** * @private */ setTitleCmp(titleCmp) { this.titleCmp = titleCmp; } /** * @private */ getTitleText() { return (this.titleCmp && this.titleCmp.getTitleText()) || ''; } /** * @private */ getTitleRef() { return this.titleCmp && this.titleCmp.elementRef; } /** * @private * A toolbar items include the left and right side `ion-buttons`, * and every `menu-toggle`. It does not include the `ion-title`. * @returns {TODO} Array of this toolbar's item ElementRefs. */ getItemRefs() { return this.itemRefs; } /** * @private */ addItemRef(itemElementRef) { this.itemRefs.push(itemElementRef); } } /** * @name Toolbar * @description * The toolbar is generic bar that sits above or below content. * Unlike an `Navbar`, `Toolbar` can be used for a subheader as well. * @usage * ```html * * My Toolbar Title * * * * ``` */ @Component({ selector: 'ion-toolbar', template: '
' + '' + '' + '' + '
' + '' + '
', host: { 'class': 'toolbar' } }) export class Toolbar extends ToolbarBase { constructor( elementRef: ElementRef, config: Config ) { super(elementRef, config); } } /** * @name ToolbarTitle * @description * `ion-title` is a component that sets the title of the `Toolbar` or `Navbar` * @usage * ```html * * Tab 1 * * * * * Tab 1 * * * SubHeader * * ``` */ @Component({ selector: 'ion-title', template: '
' + '' + '
' }) export class ToolbarTitle extends Ion { constructor( elementRef: ElementRef, @Optional() toolbar: Toolbar, @Optional() @Inject(forwardRef(() => Navbar)) navbar: Navbar ) { super(elementRef, null); toolbar && toolbar.setTitleCmp(this); navbar && navbar.setTitleCmp(this); } /** * @private */ getTitleText() { return this.getNativeElement().textContent; } } /** * @private */ @Directive({ selector: 'ion-buttons,[menuToggle],ion-nav-items' }) export class ToolbarItem { constructor( elementRef: ElementRef, @Optional() toolbar: Toolbar, @Optional() @Inject(forwardRef(() => Navbar)) navbar: Navbar ) { toolbar && toolbar.addItemRef(elementRef); navbar && navbar.addItemRef(elementRef); this.inToolbar = !!(toolbar || navbar); // Deprecation warning if (elementRef.nativeElement.tagName === 'ION-NAV-ITEMS') { if (elementRef.nativeElement.hasAttribute('primary')) { console.warn(' has been renamed to , please update your HTML'); elementRef.nativeElement.setAttribute('start', ''); } else if (elementRef.nativeElement.hasAttribute('secondary')) { console.warn(' has been renamed to , please update your HTML'); elementRef.nativeElement.setAttribute('end', ''); } else { console.warn(' has been renamed to , please update your HTML'); } } } @ContentChildren(Button) set _buttons(buttons) { if (this.inToolbar) { Button.setRoles(buttons, 'bar-button'); } } }