nest-parrot
Version:
Parrot built on react
179 lines (177 loc) • 4.83 kB
JSX
/**
* Page Header<br>
*/
(function (window, $, React, ReactDOM, $pt) {
var NPageHeader = React.createClass({
displayName: 'NPageHeader',
statics: {
SEARCH_PLACEHOLDER: 'Search...'
},
getDefaultProps: function () {
return {
side: false
};
},
/**
* get initial state
* @returns {*}
*/
getInitialState: function () {
return {
model: $pt.createModel({
text: null
})
};
},
componentDidMount: function() {
if (this.props.side && this.props.menus) {
this.state.sideMenu = NSideMenu.getSideMenu(this.props.menus, null, null, true);
}
},
/**
* render search box
* @returns {XML}
*/
renderSearchBox: function () {
var layout = $pt.createCellLayout('text', {
comp: {
placeholder: NPageHeader.SEARCH_PLACEHOLDER,
rightAddon: {
icon: 'search',
click: this.onSearchClicked
}
}
});
return (<div className="navbar-form navbar-right" role="search">
<$pt.Components.NText model={this.state.model} layout={layout}/>
</div>);
},
renderMenuItem: function (item, index, menus, onTopLevel) {
if (item.children !== undefined) {
// render dropdown menu
var _this = this;
return (
<li className={onTopLevel ? "dropdown" : "dropdown-submenu"} key={index}>
<a href="#" className="dropdown-toggle" data-toggle="dropdown" role="button"
aria-expanded="false">
{item.text} {onTopLevel ? <span className="caret"></span> : null}
</a>
<ul className="dropdown-menu" role="menu">
{item.children.map(function (childItem, childIndex, dropdownItems) {
return _this.renderMenuItem(childItem, childIndex, dropdownItems, false);
})}
</ul>
</li>
);
} else if (item.divider === true) {
// render divider
return (<li className="divider" key={index}></li>);
} else if (item.func !== undefined) {
// call javascript function
return (<li>
<a href="javascript:void(0);" onClick={this.onMenuClicked.bind(this, item.func)} key={index}>{item.text}</a>
</li>);
} else {
// jump to url
return (<li key={index}><a href={item.url}>{item.text}</a></li>);
}
},
/**
* render menus
* @returns {XML}
*/
renderMenus: function () {
var _this = this;
var css = {
'nav navbar-nav': true
};
if (this.props.side) {
css['nav-side'] = true;
}
return (
<ul className={$pt.LayoutHelper.classSet(css)}>
{this.props.menus.map(function (item, index, menu) {
return _this.renderMenuItem(item, index, menu, true);
})}
</ul>
);
},
renderBrand: function () {
if (this.props.brandUrl) {
return <a href={this.props.brandUrl}><span className="navbar-brand">{this.props.brand}</span></a>;
} else if (this.props.brandFunc || this.props.side) {
return (<a href="javascript:void(0);"
onMouseEnter={this.onBrandMouseEnter}
onMouseLeave={this.onBrandMouseLeave}
onClick={this.onBrandClicked}>
<span className="navbar-brand">{this.props.brand}</span>
</a>);
} else {
return <span className="navbar-brand">{this.props.brand}</span>;
}
},
onBrandMouseEnter: function () {
if (this.props.side) {
if (this.state.sideMenu) {
this.state.sideMenu.show();
}
}
},
onBrandMouseLeave: function () {
if (this.props.side) {
if (this.state.sideMenu) {
this.state.sideMenu.willHide();
}
}
},
/**
* on brand clicked
*/
onBrandClicked: function () {
if (this.props.brandFunc) {
this.props.brandFunc.call(this);
}
},
/**
* on menu clicked
* @param func
*/
onMenuClicked: function (func) {
func.call(this);
},
/**
* on search clicked
*/
onSearchClicked: function () {
this.props.search.call(this, this.state.model.get('text'));
},
/**
* render component
* @returns {XML}
*/
render: function () {
return (
<nav className="navbar navbar-default navbar-fixed-top">
<div className="container-fluid">
<div className="navbar-header">
<button type="button" className="navbar-toggle collapsed" data-toggle="collapse"
data-target="#navbar-1">
<span className="sr-only">Toggle navigation</span>
<span className="icon-bar"></span>
<span className="icon-bar"></span>
<span className="icon-bar"></span>
</button>
{this.renderBrand()}
</div>
<div className="collapse navbar-collapse" id="navbar-1">
{this.props.menus ? this.renderMenus() : null}
{this.props.search ? this.renderSearchBox() : null}
{this.props.custom ? this.props.custom.call(this) : null}
</div>
</div>
</nav>
);
}
});
$pt.Components.NPageHeader = NPageHeader;
}(window, jQuery, React, ReactDOM, $pt));