terriajs
Version:
Geospatial data visualization platform.
124 lines (109 loc) • 4.88 kB
JSX
import React from 'react';
import createReactClass from 'create-react-class';
import PropTypes from 'prop-types';
import 'mutationobserver-shim';
import TerriaViewerWrapper from '../Map/TerriaViewerWrapper.jsx';
import LocationBar from '../Map/Legend/LocationBar.jsx';
import DistanceLegend from '../Map/Legend/DistanceLegend.jsx';
import FeedbackButton from '../Feedback/FeedbackButton.jsx';
import ObserveModelMixin from './../ObserveModelMixin';
import BottomDock from './../BottomDock/BottomDock.jsx';
import FeatureDetection from 'terriajs-cesium/Source/Core/FeatureDetection';
import classNames from "classnames";
import Styles from './map-column.scss';
const isIE = FeatureDetection.isInternetExplorer();
/**
* Right-hand column that contains the map, controls that sit over the map and sometimes the bottom dock containing
* the timeline and charts.
*
* Note that because IE9-11 is terrible the pure-CSS layout that is used in nice browsers doesn't work, so for IE only
* we use a (usually polyfilled) MutationObserver to watch the bottom dock and resize when it changes.
*/
const MapColumn = createReactClass({
displayName: 'MapColumn',
mixins: [ObserveModelMixin],
propTypes: {
terria: PropTypes.object.isRequired,
viewState: PropTypes.object.isRequired,
},
getInitialState() {
return {};
},
/* eslint-disable-next-line camelcase */
UNSAFE_componentWillMount() {
if (isIE) {
this.observer = new MutationObserver(this.resizeMapCell);
window.addEventListener('resize', this.resizeMapCell, false);
}
},
addBottomDock(bottomDock) {
if (isIE) {
this.observer.observe(bottomDock, {
childList: true,
subtree: true
});
}
},
newMapCell(mapCell) {
if (isIE) {
this.mapCell = mapCell;
this.resizeMapCell();
}
},
resizeMapCell() {
if (this.mapCell) {
this.setState({
height: this.mapCell.offsetHeight
});
}
},
componentWillUnmount() {
if (isIE) {
window.removeEventListener('resize', this.resizeMapCell, false);
this.observer.disconnect();
}
},
render() {
return (
<div className={Styles.mapInner}>
<div className={Styles.mapRow}>
<div className={classNames(Styles.mapCell, Styles.mapCellMap)} ref={this.newMapCell}>
<div className={Styles.mapWrapper}
style={{height: this.state.height || (isIE ? '100vh' : '100%')}}>
<TerriaViewerWrapper terria={this.props.terria}
viewState={this.props.viewState}/>
</div>
<If condition={!this.props.viewState.hideMapUi()}>
<div className={Styles.locationDistance}>
<LocationBar terria={this.props.terria}
mouseCoords={this.props.viewState.mouseCoords}/>
<DistanceLegend terria={this.props.terria}/>
</div>
</If>
<If condition={!this.props.viewState.useSmallScreenInterface && this.props.terria.configParameters.feedbackUrl && !this.props.viewState.hideMapUi()}>
<div className={Styles.feedbackButtonWrapper}>
<FeedbackButton viewState={this.props.viewState}/>
</div>
</If>
</div>
<If condition={this.props.terria.configParameters.printDisclaimer}>
<div className={classNames(Styles.mapCell, 'print')}>
<a className={Styles.printDisclaimer}
href={this.props.terria.configParameters.printDisclaimer.url}>{this.props.terria.configParameters.printDisclaimer.text}
</a>
</div>
</If>
</div>
<If condition={!this.props.viewState.hideMapUi()}>
<div className={Styles.mapRow}>
<div className={Styles.mapCell}>
<BottomDock terria={this.props.terria} viewState={this.props.viewState}
domElementRef={this.addBottomDock}/>
</div>
</div>
</If>
</div>
);
},
});
export default MapColumn;