UNPKG

react-mapfilter

Version:

A React Component for viewing and filtering GeoJSON

253 lines (195 loc) 7.34 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _redux = require('redux'); var _reactRedux = require('react-redux'); var _Typography = require('@material-ui/core/Typography'); var _Typography2 = _interopRequireDefault(_Typography); var _styles = require('@material-ui/core/styles'); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _Image = require('../Image'); var _Image2 = _interopRequireDefault(_Image); var _FormattedValue = require('../Shared/FormattedValue'); var _FormattedValue2 = _interopRequireDefault(_FormattedValue); var _features_by_id = require('../../selectors/features_by_id'); var _features_by_id2 = _interopRequireDefault(_features_by_id); var _field_mapping = require('../../selectors/field_mapping'); var _field_mapping2 = _interopRequireDefault(_field_mapping); var _color_index = require('../../selectors/color_index'); var _color_index2 = _interopRequireDefault(_color_index); var _field_analysis = require('../../selectors/field_analysis'); var _field_analysis2 = _interopRequireDefault(_field_analysis); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var styles = { wrapper: { width: 200, padding: 0, backgroundColor: 'black', cursor: 'pointer', position: 'absolute', willChange: 'transform', top: 0, left: 0, pointerEvents: 'none' }, wrapperImage: { height: 200 }, image: { width: 200, height: 200, objectFit: 'cover', display: 'block', background: '#000000' }, titleBox: { position: 'absolute', bottom: 0, width: '100%', backgroundColor: 'rgba(0,0,0,0.5)', color: 'white', padding: '0.25em 0.5em', boxSizing: 'border-box' }, title: { color: 'white' }, subheading: { color: 'white' } }; var Popup = function (_React$Component) { (0, _inherits3.default)(Popup, _React$Component); function Popup(props) { (0, _classCallCheck3.default)(this, Popup); var _this = (0, _possibleConstructorReturn3.default)(this, (Popup.__proto__ || (0, _getPrototypeOf2.default)(Popup)).call(this, props)); _this.state = {}; _this.update = function (lngLat) { if (!Array.isArray(lngLat) || lngLat.length !== 2) lngLat = _this.props.lngLat; var w = _this._el.offsetWidth; var h = _this._el.offsetHeight; _this.setState({ transform: getPopupTransform(_this.map, lngLat, w, h, _this.props.offset) }); }; _this.map = props.map; return _this; } (0, _createClass3.default)(Popup, [{ key: 'componentDidMount', value: function componentDidMount() { var lngLat = this.props.lngLat; this.map.on('move', this.update); this.update(lngLat); } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(_ref) { var lngLat = _ref.lngLat; this.update(lngLat); } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { this.map.off('move', this.update); } }, { key: 'render', value: function render() { var _this2 = this; var _props = this.props, media = _props.media, title = _props.title, subtitle = _props.subtitle, classes = _props.classes, titleType = _props.titleType, subtitleType = _props.subtitleType; var transform = this.state.transform; return _react2.default.createElement( 'div', { className: (0, _classnames2.default)(classes.wrapper, (0, _defineProperty3.default)({}, classes.wrapperImage, media)), style: { transform: transform }, ref: function ref(el) { return _this2._el = el; } }, media && _react2.default.createElement(_Image2.default, { src: media, className: classes.image }), _react2.default.createElement( 'div', { className: classes.titleBox }, title && _react2.default.createElement( _Typography2.default, { variant: 'title', className: classes.title }, _react2.default.createElement(_FormattedValue2.default, { value: title, type: titleType }) ), subtitle && _react2.default.createElement( _Typography2.default, { variant: 'subheading', className: classes.subheading }, _react2.default.createElement(_FormattedValue2.default, { value: subtitle, type: subtitleType }) ) ) ); } }]); return Popup; }(_react2.default.Component); Popup.defaultProps = { offset: { x: 0, y: 0 } }; function getPopupTransform(map, lngLat, width, height) { var offset = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : { x: 0, y: 0 }; var pos = map.project(lngLat).round(); var anchor = void 0; if (pos.y < height) { anchor = 'top'; } else { anchor = 'bottom'; } if (pos.x > map.transform.width - width) { anchor += '-right'; } else { anchor += '-left'; } var anchorTranslate = { 'top-left': 'translate(0,0)', 'top-right': 'translate(-100%,0)', 'bottom-left': 'translate(0,-100%)', 'bottom-right': 'translate(-100%,-100%)' }; return anchorTranslate[anchor] + ' translate(' + (pos.x + offset.x) + 'px,' + (pos.y + offset.y) + 'px)'; } var mapStateToProps = function mapStateToProps(state, ownProps) { var featuresById = (0, _features_by_id2.default)(state); var colorIndex = (0, _color_index2.default)(state); var fieldMapping = (0, _field_mapping2.default)(state); var feature = featuresById[ownProps.id]; if (!feature) return {}; var geojsonProps = feature.properties; var fieldAnalysisProps = (0, _field_analysis2.default)(state).properties; return { media: geojsonProps[fieldMapping.media], title: geojsonProps[fieldMapping.title], subtitle: geojsonProps[fieldMapping.subtitle], color: colorIndex[geojsonProps[fieldMapping.color]], titleType: fieldAnalysisProps[fieldMapping.title] && fieldAnalysisProps[fieldMapping.title].type, subtitleType: fieldAnalysisProps[fieldMapping.subtitle] && fieldAnalysisProps[fieldMapping.subtitle].type }; }; exports.default = (0, _redux.compose)((0, _reactRedux.connect)(mapStateToProps), (0, _styles.withStyles)(styles))(Popup); //# sourceMappingURL=Popup.js.map