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');
}
}
}