terriajs
Version:
Geospatial data visualization platform.
90 lines (71 loc) • 3.25 kB
JSX
;
import defined from 'terriajs-cesium/Source/Core/defined';
import React from 'react';
import createReactClass from 'create-react-class';
import PropTypes from 'prop-types';
import ObserveModelMixin from '../../ObserveModelMixin';
import Styles from './dimension-selector-section.scss';
const DimensionSelectorSection = createReactClass({
displayName: 'DimensionSelectorSection',
mixins: [ObserveModelMixin],
propTypes: {
item: PropTypes.object.isRequired
},
changeDimension(dimension, event) {
const item = this.props.item;
const dimensions = item.dimensions || {};
dimensions[dimension.name] = event.target.value;
item.dimensions = dimensions;
item.refresh();
},
render() {
const item = this.props.item;
// This section only makes sense if we have a layer that has dimensions.
if (item.disableUserChanges || !defined(item.availableDimensions) || !defined(item.layers)) {
return null;
}
const dimensions = [];
item.layers.split(',').forEach(layerName => {
const layerDimensions = item.availableDimensions[layerName];
if (!layerDimensions) {
return;
}
layerDimensions.forEach(layerDimension => {
// Don't include the time dimension; it is handled specially
if (layerDimension.name.toLowerCase() === 'time') {
return;
}
// Only use the first dimension we find with each name.
const existingDimension = dimensions.filter(dimension => dimension.name === layerDimension.name)[0];
if (!defined(existingDimension)) {
dimensions.push(layerDimension);
}
});
});
return (
<div className={Styles.dimensionSelector}>
{dimensions.map(this.renderDimensionSelector)}
</div>
);
},
renderDimensionSelector(dimension) {
const dimensionValues = dimension.options;
const selectedDimensions = this.props.item.dimensions || {};
const value = selectedDimensions[dimension.name] || dimension.default || '';
const addDefault = value.length === 0 && dimension.options.indexOf(value) < 0;
let title = dimension.name.length > 0 ? dimension.name.charAt(0).toUpperCase() + dimension.name.slice(1) : '';
if (dimension.unitSymbol) {
title += '(' + dimension.unitSymbol + ')';
}
return (
<div key={dimension.name}>
<label className={Styles.title} htmlFor={dimension.name}>{title}</label>
<select className={Styles.field} name={dimension.name} value={value} onChange={this.changeDimension.bind(this, dimension)}>
{addDefault && <option key="__default__" value="">Default</option>}
{dimensionValues.map(item => <option key={item} value={item}>{item}</option>)}
</select>
</div>
);
},
});
module.exports = DimensionSelectorSection;