terriajs
Version:
Geospatial data visualization platform.
212 lines (196 loc) • 6.52 kB
JSX
import React from "react";
import { observer } from "mobx-react";
import classNames from "classnames";
import createReactClass from "create-react-class";
import Icon from "../../../../Styled/Icon";
import Box from "../../../../Styled/Box";
import PropTypes from "prop-types";
import DataCatalog from "../../../DataCatalog/DataCatalog.jsx";
import DataPreview from "../../../Preview/DataPreview.jsx";
import AddData from "./AddData.jsx";
import { withTranslation, Trans } from "react-i18next";
import Styles from "./my-data-tab.scss";
// My data tab include Add data section and preview section
const MyDataTab = observer(
createReactClass({
displayName: "MyDataTab",
propTypes: {
terria: PropTypes.object,
viewState: PropTypes.object,
onFileAddFinished: PropTypes.func.isRequired,
onUrlAddFinished: PropTypes.func.isRequired,
localDataTypes: PropTypes.arrayOf(PropTypes.object),
remoteDataTypes: PropTypes.arrayOf(PropTypes.object),
className: PropTypes.string,
t: PropTypes.func.isRequired
},
getInitialState() {
return {
activeTab: null
};
},
hasUserAddedData() {
return this.props.terria.catalog.userAddedDataGroup.members.length > 0;
},
changeTab(active) {
this.setState({
activeTab: active
});
},
resetTab() {
this.setState({
activeTab: null
});
},
renderTabs() {
const { t } = this.props;
const tabs = [
{
id: "local",
caption: t("addData.localTitle")
},
{
id: "web",
caption: t("addData.webTitle")
}
];
return (
<ul className={Styles.tabList}>
<For each="tab" of={tabs}>
<li className={Styles.tabListItem} key={tab.id}>
<button
type="button"
onClick={this.changeTab.bind(null, tab.id)}
title={tab.caption}
className={classNames(Styles.tabListBtn, {
[Styles.isActive]: this.state.activeTab === tab.id
})}
css={`
color: ${(p) => p.theme.colorPrimary};
&:hover,
&:focus {
color: ${(p) => p.theme.grey};
}
svg {
fill: ${(p) => p.theme.colorPrimary};
}
`}
>
<Icon glyph={Icon.GLYPHS[tab.id]} />
{tab.caption}
</button>
</li>
</For>
</ul>
);
},
renderPromptBox() {
if (this.hasUserAddedData()) {
const { t } = this.props;
return (
<div className={Styles.dataTypeTab}>
<div className={Styles.dndBox}>
<Icon glyph={Icon.GLYPHS.upload} />
{t("addData.dragDrop")}
</div>
</div>
);
}
return (
<div className={Styles.dataTypeTab}>
<div className={Styles.dndBoxInfo}>
<Trans i18nKey="addData.infoText">
<div>Drag and drop a file here to view it locally on the map</div>
<div>(it won’t be saved or uploaded to the internet)</div>
</Trans>
<div className={Styles.tabCenter}>{this.renderTabs()}</div>
</div>
<div className={Styles.dndBox}>
<Icon glyph={Icon.GLYPHS.upload} />
</div>
</div>
);
},
render() {
const showTwoColumn = this.hasUserAddedData() & !this.state.activeTab;
const { t, className } = this.props;
return (
<Box
className={classNames(Styles.root, {
[className]: className !== undefined
})}
>
<div
className={classNames({
[Styles.leftCol]: showTwoColumn,
[Styles.oneCol]: !showTwoColumn
})}
>
<If condition={this.state.activeTab}>
<button
type="button"
onClick={this.resetTab}
className={Styles.btnBackToMyData}
css={`
color: ${(p) => p.theme.colorPrimary};
&:hover,
&:focus {
border: 1px solid ${(p) => p.theme.colorPrimary};
}
svg {
fill: ${(p) => p.theme.colorPrimary};
}
`}
>
<Icon glyph={Icon.GLYPHS.left} />
{t("addData.back")}
</button>
<AddData
terria={this.props.terria}
viewState={this.props.viewState}
activeTab={this.state.activeTab}
resetTab={this.resetTab}
onFileAddFinished={this.props.onFileAddFinished}
onUrlAddFinished={this.props.onUrlAddFinished}
localDataTypes={this.props.localDataTypes}
remoteDataTypes={this.props.remoteDataTypes}
/>
</If>
<If condition={showTwoColumn}>
<Box flexShrinkZero column>
<p className={Styles.explanation}>
<Trans i18nKey="addData.note">
<strong>Note: </strong>Data added in this way is not saved
or made visible to others.
</Trans>
</p>
<div className={Styles.tabLeft}>{this.renderTabs()}</div>
<ul className={Styles.dataCatalog}>
<DataCatalog
items={
this.props.terria.catalog.userAddedDataGroup.memberModels
}
removable={true}
viewState={this.props.viewState}
terria={this.props.terria}
/>
</ul>
</Box>
</If>
<If condition={!this.state.activeTab}>{this.renderPromptBox()}</If>
</div>
<If condition={showTwoColumn}>
<Box styledWidth="60%">
<DataPreview
terria={this.props.terria}
viewState={this.props.viewState}
previewed={this.props.viewState.userDataPreviewedItem}
/>
</Box>
</If>
</Box>
);
}
})
);
module.exports = withTranslation()(MyDataTab);