kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
227 lines (182 loc) • 18.4 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
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 _taggedTemplateLiteral2 = require('babel-runtime/helpers/taggedTemplateLiteral');
var _taggedTemplateLiteral3 = _interopRequireDefault(_taggedTemplateLiteral2);
var _class, _temp;
var _templateObject = (0, _taggedTemplateLiteral3.default)(['\n .selection {\n stroke: none;\n fill: ', ';\n opacity: 1;\n }\n'], ['\n .selection {\n stroke: none;\n fill: ', ';\n opacity: 1;\n }\n']); // Copyright (c) 2018 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _styledComponents = require('styled-components');
var _styledComponents2 = _interopRequireDefault(_styledComponents);
var _d3Selection = require('d3-selection');
var _d3Brush = require('d3-brush');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var StyledG = _styledComponents2.default.g(_templateObject, function (props) {
return props.theme.rangeBrushBgd;
});
var RangeBrush = (_temp = _class = function (_Component) {
(0, _inherits3.default)(RangeBrush, _Component);
function RangeBrush() {
(0, _classCallCheck3.default)(this, RangeBrush);
return (0, _possibleConstructorReturn3.default)(this, (RangeBrush.__proto__ || Object.getPrototypeOf(RangeBrush)).apply(this, arguments));
}
(0, _createClass3.default)(RangeBrush, [{
key: 'componentDidMount',
value: function componentDidMount() {
var _this2 = this;
var _props = this.props,
_props$range = (0, _slicedToArray3.default)(_props.range, 2),
min = _props$range[0],
max = _props$range[1],
_props$value = (0, _slicedToArray3.default)(_props.value, 2),
val0 = _props$value[0],
val1 = _props$value[1];
// We want the React app to respond to brush state and vice-versa
// but d3-brush fires the same events for both user-initiated brushing
// and programmatic brushing (brush.move). We need these flags to
// distinguish between the uses.
//
// We don't use state because that would trigger another `componentDidUpate`
this.brushing = false;
this.moving = false;
this.root = (0, _d3Selection.select)(this.rootContainer);
this.brush = (0, _d3Brush.brushX)().on('start', function () {
_this2.brushing = true;
}).on('brush', function () {
if (_this2.moving) {
return;
}
_d3Selection.event.selection === null ? _this2._reset() : _this2._brush(_d3Selection.event.selection);
}).on('end', function () {
if (!_this2.moving && _d3Selection.event.selection === null) {
_this2._reset();
}
_this2.brushing = false;
_this2.moving = false;
});
this.root.call(this.brush);
if (val0 === min && val1 === max) {
this._reset();
}
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps) {
var _props2 = this.props,
_props2$range = (0, _slicedToArray3.default)(_props2.range, 2),
min = _props2$range[0],
max = _props2$range[1],
_props2$value = (0, _slicedToArray3.default)(_props2.value, 2),
val0 = _props2$value[0],
val1 = _props2$value[1],
width = _props2.width;
var _prevProps$value = (0, _slicedToArray3.default)(prevProps.value, 2),
prevVal0 = _prevProps$value[0],
prevVal1 = _prevProps$value[1];
if (prevProps.width !== width) {
this.root.call(this.brush);
this._move(val0, val1);
}
if (!this.brushing && !this.moving) {
if (val0 === min && val1 === max) {
this.moving = true;
this.brush.move(this.root, null);
}
if (prevVal0 !== val0 || prevVal1 !== val1) {
this.moving = true;
this._move(val0, val1);
}
}
}
}, {
key: '_reset',
value: function _reset() {
var _props$range2 = (0, _slicedToArray3.default)(this.props.range, 2),
minValue = _props$range2[0],
maxValue = _props$range2[1];
this.props.onBrush(minValue, maxValue);
}
}, {
key: '_move',
value: function _move(val0, val1) {
var _props3 = this.props,
_props3$domain = (0, _slicedToArray3.default)(_props3.domain, 2),
min = _props3$domain[0],
max = _props3$domain[1],
width = _props3.width;
var scale = function scale(x) {
return (x - min) * width / (max - min);
};
this.brush.move(this.root, [scale(val0), scale(val1)]);
}
}, {
key: '_brush',
value: function _brush(_ref) {
var _ref2 = (0, _slicedToArray3.default)(_ref, 2),
sel0 = _ref2[0],
sel1 = _ref2[1];
var _props4 = this.props,
_props4$domain = (0, _slicedToArray3.default)(_props4.domain, 2),
min = _props4$domain[0],
max = _props4$domain[1],
onBrush = _props4.onBrush,
width = _props4.width;
var invert = function invert(x) {
return x * (max - min) / width + min;
};
onBrush(invert(sel0), invert(sel1));
}
}, {
key: 'render',
value: function render() {
var _this3 = this;
return _react2.default.createElement(StyledG, { className: 'kg-range-slider__brush',
innerRef: function innerRef(comp) {
_this3.rootContainer = comp;
} });
}
}]);
return RangeBrush;
}(_react.Component), _class.propTypes = {
domain: _propTypes2.default.arrayOf(_propTypes2.default.number).isRequired,
onBrush: _propTypes2.default.func.isRequired,
range: _propTypes2.default.arrayOf(_propTypes2.default.number).isRequired,
value: _propTypes2.default.arrayOf(_propTypes2.default.number).isRequired,
width: _propTypes2.default.number.isRequired
}, _temp);
exports.default = RangeBrush;
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9yYW5nZS1icnVzaC5qcyJdLCJuYW1lcyI6WyJTdHlsZWRHIiwic3R5bGVkIiwiZyIsInByb3BzIiwidGhlbWUiLCJyYW5nZUJydXNoQmdkIiwiUmFuZ2VCcnVzaCIsInJhbmdlIiwibWluIiwibWF4IiwidmFsdWUiLCJ2YWwwIiwidmFsMSIsImJydXNoaW5nIiwibW92aW5nIiwicm9vdCIsInJvb3RDb250YWluZXIiLCJicnVzaCIsIm9uIiwiZXZlbnQiLCJzZWxlY3Rpb24iLCJfcmVzZXQiLCJfYnJ1c2giLCJjYWxsIiwicHJldlByb3BzIiwid2lkdGgiLCJwcmV2VmFsMCIsInByZXZWYWwxIiwiX21vdmUiLCJtb3ZlIiwibWluVmFsdWUiLCJtYXhWYWx1ZSIsIm9uQnJ1c2giLCJkb21haW4iLCJzY2FsZSIsIngiLCJzZWwwIiwic2VsMSIsImludmVydCIsImNvbXAiLCJDb21wb25lbnQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJhcnJheU9mIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsImZ1bmMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztnT0FBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUVBLElBQU1BLFVBQVVDLDJCQUFPQyxDQUFqQixrQkFHTTtBQUFBLFNBQVNDLE1BQU1DLEtBQU4sQ0FBWUMsYUFBckI7QUFBQSxDQUhOLENBQU47O0lBUXFCQyxVOzs7Ozs7Ozs7O3dDQVNDO0FBQUE7O0FBQUEsbUJBQytCLEtBQUtILEtBRHBDO0FBQUEsNkRBQ1hJLEtBRFc7QUFBQSxVQUNIQyxHQURHO0FBQUEsVUFDRUMsR0FERjtBQUFBLDZEQUNRQyxLQURSO0FBQUEs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b250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAxOCBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IHtldmVudCwgc2VsZWN0fSBmcm9tICdkMy1zZWxlY3Rpb24nO1xuaW1wb3J0IHticnVzaFh9IGZyb20gJ2QzLWJydXNoJztcblxuY29uc3QgU3R5bGVkRyA9IHN0eWxlZC5nYFxuICAuc2VsZWN0aW9uIHtcbiAgICBzdHJva2U6IG5vbmU7XG4gICAgZmlsbDogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5yYW5nZUJydXNoQmdkfTtcbiAgICBvcGFjaXR5OiAxO1xuICB9XG5gO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSYW5nZUJydXNoIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBkb21haW46IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLmlzUmVxdWlyZWQsXG4gICAgb25CcnVzaDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICByYW5nZTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm51bWJlcikuaXNSZXF1aXJlZCxcbiAgICB2YWx1ZTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm51bWJlcikuaXNSZXF1aXJlZCxcbiAgICB3aWR0aDogUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkXG4gIH07XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgY29uc3Qge3JhbmdlOiBbbWluLCBtYXhdLCB2YWx1ZTogW3ZhbDAsIHZhbDFdfSA9IHRoaXMucHJvcHM7XG4gICAgLy8gV2Ugd2FudCB0aGUgUmVhY3QgYXBwIHRvIHJlc3BvbmQgdG8gYnJ1c2ggc3RhdGUgYW5kIHZpY2UtdmVyc2FcbiAgICAvLyBidXQgZDMtYnJ1c2ggZmlyZXMgdGhlIHNhbWUgZXZlbnRzIGZvciBib3RoIHVzZXItaW5pdGlhdGVkIGJydXNoaW5nXG4gICAgLy8gYW5kIHByb2dyYW1tYXRpYyBicnVzaGluZyAoYnJ1c2gubW92ZSkuIFdlIG5lZWQgdGhlc2UgZmxhZ3MgdG9cbiAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB1c2VzLlxuICAgIC8vXG4gICAgLy8gV2UgZG9uJ3QgdXNlIHN0YXRlIGJlY2F1c2UgdGhhdCB3b3VsZCB0cmlnZ2VyIGFub3RoZXIgYGNvbXBvbmVudERpZFVwYXRlYFxuICAgIHRoaXMuYnJ1c2hpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xuXG4gICAgdGhpcy5yb290ID0gc2VsZWN0KHRoaXMucm9vdENvbnRhaW5lcik7XG4gICAgdGhpcy5icnVzaCA9IGJydXNoWCgpXG4gICAgICAub24oJ3N0YXJ0JywgKCkgPT4ge1xuICAgICAgICB0aGlzLmJydXNoaW5nID0gdHJ1ZTtcbiAgICAgIH0pXG4gICAgICAub24oJ2JydXNoJywgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tb3ZpbmcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5zZWxlY3Rpb24gPT09IG51bGwgPyB0aGlzLl9yZXNldCgpIDogdGhpcy5fYnJ1c2goZXZlbnQuc2VsZWN0aW9uKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1vdmluZyAmJiBldmVudC5zZWxlY3Rpb24gPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9yZXNldCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5icnVzaGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vdmluZyA9IGZhbHNlO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnJvb3QuY2FsbCh0aGlzLmJydXNoKTtcblxuICAgIGlmICh2YWwwID09PSBtaW4gJiYgdmFsMSA9PT0gbWF4KSB7XG4gICAgICB0aGlzLl9yZXNldCgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICBjb25zdCB7cmFuZ2U6IFttaW4sIG1heF0sIHZhbHVlOiBbdmFsMCwgdmFsMV0sIHdpZHRofSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgW3ByZXZWYWwwLCBwcmV2VmFsMV0gPSBwcmV2UHJvcHMudmFsdWU7XG5cbiAgICBpZiAocHJldlByb3BzLndpZHRoICE9PSB3aWR0aCkge1xuICAgICAgdGhpcy5yb290LmNhbGwodGhpcy5icnVzaCk7XG4gICAgICB0aGlzLl9tb3ZlKHZhbDAsIHZhbDEpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5icnVzaGluZyAmJiAhdGhpcy5tb3ZpbmcpIHtcbiAgICAgIGlmICh2YWwwID09PSBtaW4gJiYgdmFsMSA9PT0gbWF4KSB7XG4gICAgICAgIHRoaXMubW92aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5icnVzaC5tb3ZlKHRoaXMucm9vdCwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcmV2VmFsMCAhPT0gdmFsMCB8fCBwcmV2VmFsMSAhPT0gdmFsMSkge1xuICAgICAgICB0aGlzLm1vdmluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuX21vdmUodmFsMCwgdmFsMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3Jlc2V0KCkge1xuICAgIGNvbnN0IFttaW5WYWx1ZSwgbWF4VmFsdWVdID0gdGhpcy5wcm9wcy5yYW5nZTtcbiAgICB0aGlzLnByb3BzLm9uQnJ1c2gobWluVmFsdWUsIG1heFZhbHVlKTtcbiAgfVxuXG4gIF9tb3ZlKHZhbDAsIHZhbDEpIHtcbiAgICBjb25zdCB7ZG9tYWluOiBbbWluLCBtYXhdLCB3aWR0aH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHNjYWxlID0geCA9PiAoeCAtIG1pbikgKiB3aWR0aCAvIChtYXggLSBtaW4pO1xuICAgIHRoaXMuYnJ1c2gubW92ZSh0aGlzLnJvb3QsIFtzY2FsZSh2YWwwKSwgc2NhbGUodmFsMSldKTtcbiAgfVxuXG4gIF9icnVzaChbc2VsMCwgc2VsMV0pIHtcbiAgICBjb25zdCB7ZG9tYWluOiBbbWluLCBtYXhdLCBvbkJydXNoLCB3aWR0aH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IGludmVydCA9IHggPT4geCAqIChtYXggLSBtaW4pIC8gd2lkdGggKyBtaW47XG4gICAgb25CcnVzaChpbnZlcnQoc2VsMCksIGludmVydChzZWwxKSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIDxTdHlsZWRHIGNsYXNzTmFtZT1cImtnLXJhbmdlLXNsaWRlcl9fYnJ1c2hcIlxuICAgICAgICAgICAgICAgICAgICBpbm5lclJlZj17Y29tcCA9PiB7XG4gICAgICB0aGlzLnJvb3RDb250YWluZXIgPSBjb21wO1xuICAgIH19Lz47XG4gIH1cbn07XG4iXX0=