terriajs
Version:
Geospatial data visualization platform.
124 lines (111 loc) • 5.09 kB
JSX
import React from 'react';
import createReactClass from 'create-react-class';
import PropTypes from 'prop-types';
import classNames from 'classnames';
import DataCatalogTab from './Tabs/DataCatalogTab.jsx';
import MyDataTab from './Tabs/MyDataTab/MyDataTab.jsx';
import ObserveModelMixin from '../ObserveModelMixin';
import defined from 'terriajs-cesium/Source/Core/defined';
import Styles from './tabs.scss';
const Tabs = createReactClass({
displayName: 'Tabs',
mixins: [ObserveModelMixin],
propTypes: {
terria: PropTypes.object.isRequired,
viewState: PropTypes.object.isRequired,
tabs: PropTypes.array
},
getTabs() {
// This can be passed in as prop
if (this.props.tabs) {
return this.props.tabs;
}
const myDataTab = {
name: 'My Data',
title: 'my-data',
category: 'my-data',
panel: <MyDataTab terria={this.props.terria}
viewState={this.props.viewState}
/>
};
if (this.props.terria.configParameters.tabbedCatalog) {
return [].concat(this.props.terria.catalog.group.items.filter(member => member !== this.props.terria.catalog.userAddedDataGroup).map((member, i) => ({
name: member.nameInCatalog,
title: `data-catalog-${member.name}`,
category: 'data-catalog',
idInCategory: member.name,
panel: <DataCatalogTab terria={this.props.terria}
viewState={this.props.viewState}
items={member.items || [member]}
searchPlaceholder="Search whole catalogue"
/>
})), [myDataTab]);
} else {
return [
{
name: 'Data Catalogue',
title: 'data-catalog',
category: 'data-catalog',
panel: <DataCatalogTab terria={this.props.terria}
viewState={this.props.viewState}
items={this.props.terria.catalog.group.items}
searchPlaceholder="Search the catalogue"
/>
},
myDataTab
];
}
},
activateTab(category, idInCategory) {
this.props.viewState.activeTabCategory = category;
if (this.props.terria.configParameters.tabbedCatalog) {
this.props.viewState.activeTabIdInCategory = idInCategory;
if (category === 'data-catalog') {
const member = this.props.terria.catalog.group.items.filter(m => m.name === idInCategory)[0];
// If member was found and member can be opened, open it (causes CkanCatalogGroups to fetch etc.)
if (defined(member)) {
if (member.toggleOpen) {
member.isOpen = true;
}
this.props.viewState.previewedItem = member;
}
}
}
},
render() {
const tabs = this.getTabs();
const sameCategory = tabs.filter(t => t.category === this.props.viewState.activeTabCategory);
const currentTab = sameCategory.filter(t => t.idInCategory === this.props.viewState.activeTabIdInCategory)[0] || sameCategory[0] || tabs[0];
return (
<div className={Styles.tabs}>
<ul className={Styles.tabList} role="tablist">
<For each="item" index="i" of={tabs}>
<li key={i}
id={'tablist--' + item.title}
className={Styles.tabListItem}
role="tab"
aria-controls={'panel--' + item.title}
aria-selected={item === currentTab}>
<button type='button'
onClick={this.activateTab.bind(this, item.category, item.idInCategory)}
className={classNames(Styles.btnTab, {[Styles.btnSelected]: item === currentTab})}>
{item.name}
</button>
</li>
</For>
</ul>
<section
key={currentTab.title}
id={'panel--' + currentTab.title}
className={classNames(Styles.tabPanel, Styles.isActive)}
aria-labelledby={'tablist--' + currentTab.title}
role='tabpanel' tabIndex='0'>
<div className={Styles.panelContent}>
{currentTab.panel}
</div>
</section>
</div>
);
},
});
module.exports = Tabs;