|
|
|
@ -1,7 +1,7 @@ |
|
|
|
|
import React from 'react'; |
|
|
|
|
import { NavModel, NavModelItem } from '../../nav_model_srv'; |
|
|
|
|
import classNames from 'classnames'; |
|
|
|
|
import appEvents from 'app/core/app_events'; |
|
|
|
|
import React from "react"; |
|
|
|
|
import { NavModel, NavModelItem } from "../../nav_model_srv"; |
|
|
|
|
import classNames from "classnames"; |
|
|
|
|
import appEvents from "app/core/app_events"; |
|
|
|
|
|
|
|
|
|
export interface IProps { |
|
|
|
|
model: NavModel; |
|
|
|
@ -9,12 +9,12 @@ export interface IProps { |
|
|
|
|
|
|
|
|
|
function TabItem(tab: NavModelItem) { |
|
|
|
|
if (tab.hideFromTabs) { |
|
|
|
|
return (null); |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
let tabClasses = classNames({ |
|
|
|
|
'gf-tabs-link': true, |
|
|
|
|
active: tab.active, |
|
|
|
|
"gf-tabs-link": true, |
|
|
|
|
active: tab.active |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
@ -28,8 +28,9 @@ function TabItem(tab: NavModelItem) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function SelectOption(navItem: NavModelItem) { |
|
|
|
|
if (navItem.hideFromTabs) { // TODO: Rename hideFromTabs => hideFromNav
|
|
|
|
|
return (null); |
|
|
|
|
if (navItem.hideFromTabs) { |
|
|
|
|
// TODO: Rename hideFromTabs => hideFromNav
|
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
@ -39,14 +40,22 @@ function SelectOption(navItem: NavModelItem) { |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function Navigation({main}: {main: NavModelItem}) { |
|
|
|
|
return (<nav> |
|
|
|
|
<SelectNav customCss="page-header__select_nav" main={main} /> |
|
|
|
|
<Tabs customCss="page-header__tabs" main={main} /> |
|
|
|
|
</nav>); |
|
|
|
|
function Navigation({ main }: { main: NavModelItem }) { |
|
|
|
|
return ( |
|
|
|
|
<nav> |
|
|
|
|
<SelectNav customCss="page-header__select-nav" main={main} /> |
|
|
|
|
<Tabs customCss="page-header__tabs" main={main} /> |
|
|
|
|
</nav> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function SelectNav({main, customCss}: {main: NavModelItem, customCss: string}) { |
|
|
|
|
function SelectNav({ |
|
|
|
|
main, |
|
|
|
|
customCss |
|
|
|
|
}: { |
|
|
|
|
main: NavModelItem; |
|
|
|
|
customCss: string; |
|
|
|
|
}) { |
|
|
|
|
const defaultSelectedItem = main.children.find(navItem => { |
|
|
|
|
return navItem.active === true; |
|
|
|
|
}); |
|
|
|
@ -54,17 +63,32 @@ function SelectNav({main, customCss}: {main: NavModelItem, customCss: string}) { |
|
|
|
|
const gotoUrl = evt => { |
|
|
|
|
var element = evt.target; |
|
|
|
|
var url = element.options[element.selectedIndex].value; |
|
|
|
|
appEvents.emit('location-change', {href: url}); |
|
|
|
|
appEvents.emit("location-change", { href: url }); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
return (<select |
|
|
|
|
className={`gf-select-nav ${customCss}`} |
|
|
|
|
defaultValue={defaultSelectedItem.url} |
|
|
|
|
onChange={gotoUrl}>{main.children.map(SelectOption)}</select>); |
|
|
|
|
return ( |
|
|
|
|
<div className={`gf-form-select-wrapper width-20 ${customCss}`}> |
|
|
|
|
<label |
|
|
|
|
className={`gf-form-select-icon ${defaultSelectedItem.icon}`} |
|
|
|
|
htmlFor="page-header-select-nav" |
|
|
|
|
/> |
|
|
|
|
{/* Label to make it clickable */} |
|
|
|
|
<select |
|
|
|
|
className="gf-select-nav gf-form-input" |
|
|
|
|
defaultValue={defaultSelectedItem.url} |
|
|
|
|
onChange={gotoUrl} |
|
|
|
|
id="page-header-select-nav" |
|
|
|
|
> |
|
|
|
|
{main.children.map(SelectOption)} |
|
|
|
|
</select> |
|
|
|
|
</div> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function Tabs({main, customCss}: {main: NavModelItem, customCss: string}) { |
|
|
|
|
return <ul className={`gf-tabs ${customCss}`}>{main.children.map(TabItem)}</ul>; |
|
|
|
|
function Tabs({ main, customCss }: { main: NavModelItem; customCss: string }) { |
|
|
|
|
return ( |
|
|
|
|
<ul className={`gf-tabs ${customCss}`}>{main.children.map(TabItem)}</ul> |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export default class PageHeader extends React.Component<IProps, any> { |
|
|
|
@ -77,7 +101,11 @@ export default class PageHeader extends React.Component<IProps, any> { |
|
|
|
|
for (let i = 0; i < breadcrumbs.length; i++) { |
|
|
|
|
const bc = breadcrumbs[i]; |
|
|
|
|
if (bc.url) { |
|
|
|
|
breadcrumbsResult.push(<a className="text-link" key={i} href={bc.url}>{bc.title}</a>); |
|
|
|
|
breadcrumbsResult.push( |
|
|
|
|
<a className="text-link" key={i} href={bc.url}> |
|
|
|
|
{bc.title} |
|
|
|
|
</a> |
|
|
|
|
); |
|
|
|
|
} else { |
|
|
|
|
breadcrumbsResult.push(<span key={i}> / {bc.title}</span>); |
|
|
|
|
} |
|
|
|
@ -95,12 +123,15 @@ export default class PageHeader extends React.Component<IProps, any> { |
|
|
|
|
|
|
|
|
|
<div className="page-header__info-block"> |
|
|
|
|
{main.text && <h1 className="page-header__title">{main.text}</h1>} |
|
|
|
|
{main.breadcrumbs && main.breadcrumbs.length > 0 && ( |
|
|
|
|
<h1 className="page-header__title"> |
|
|
|
|
{this.renderBreadcrumb(main.breadcrumbs)} |
|
|
|
|
</h1>) |
|
|
|
|
} |
|
|
|
|
{main.subTitle && <div className="page-header__sub-title">{main.subTitle}</div>} |
|
|
|
|
{main.breadcrumbs && |
|
|
|
|
main.breadcrumbs.length > 0 && ( |
|
|
|
|
<h1 className="page-header__title"> |
|
|
|
|
{this.renderBreadcrumb(main.breadcrumbs)} |
|
|
|
|
</h1> |
|
|
|
|
)} |
|
|
|
|
{main.subTitle && ( |
|
|
|
|
<div className="page-header__sub-title">{main.subTitle}</div> |
|
|
|
|
)} |
|
|
|
|
{main.subType && ( |
|
|
|
|
<div className="page-header__stamps"> |
|
|
|
|
<i className={main.subType.icon} /> |
|
|
|
|