UNPKG

kepler.gl.geoiq

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

210 lines (167 loc) 17.7 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _d3Selection = require("d3-selection"); var _d3Brush = require("d3-brush"); function _templateObject() { var data = (0, _taggedTemplateLiteral2["default"])(["\n .selection {\n stroke: none;\n fill: ", ";\n opacity: 1;\n }\n"]); _templateObject = function _templateObject() { return data; }; return data; } var StyledG = _styledComponents["default"].g(_templateObject(), function (props) { return props.theme.rangeBrushBgd; }); var RangeBrush = /*#__PURE__*/ function (_Component) { (0, _inherits2["default"])(RangeBrush, _Component); function RangeBrush() { (0, _classCallCheck2["default"])(this, RangeBrush); return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(RangeBrush).apply(this, arguments)); } (0, _createClass2["default"])(RangeBrush, [{ key: "componentDidMount", value: function componentDidMount() { var _this = this; var _this$props = this.props, _this$props$range = (0, _slicedToArray2["default"])(_this$props.range, 2), min = _this$props$range[0], max = _this$props$range[1], _this$props$value = (0, _slicedToArray2["default"])(_this$props.value, 2), val0 = _this$props$value[0], val1 = _this$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 () { _this.brushing = true; }).on('brush', function () { if (_this.moving) { return; } _d3Selection.event.selection === null ? _this._reset() : _this._brush(_d3Selection.event.selection); }).on('end', function () { if (!_this.moving && _d3Selection.event.selection === null) { _this._reset(); } _this.brushing = false; _this.moving = false; }); this.root.call(this.brush); if (val0 === min && val1 === max) { this._reset(); } } }, { key: "componentDidUpdate", value: function componentDidUpdate(prevProps) { var _this$props2 = this.props, _this$props2$range = (0, _slicedToArray2["default"])(_this$props2.range, 2), min = _this$props2$range[0], max = _this$props2$range[1], _this$props2$value = (0, _slicedToArray2["default"])(_this$props2.value, 2), val0 = _this$props2$value[0], val1 = _this$props2$value[1], width = _this$props2.width; var _prevProps$value = (0, _slicedToArray2["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 _this$props$range2 = (0, _slicedToArray2["default"])(this.props.range, 2), minValue = _this$props$range2[0], maxValue = _this$props$range2[1]; this.props.onBrush(minValue, maxValue); } }, { key: "_move", value: function _move(val0, val1) { var _this$props3 = this.props, _this$props3$domain = (0, _slicedToArray2["default"])(_this$props3.domain, 2), min = _this$props3$domain[0], max = _this$props3$domain[1], width = _this$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, _slicedToArray2["default"])(_ref, 2), sel0 = _ref2[0], sel1 = _ref2[1]; var _this$props4 = this.props, _this$props4$domain = (0, _slicedToArray2["default"])(_this$props4.domain, 2), min = _this$props4$domain[0], max = _this$props4$domain[1], onBrush = _this$props4.onBrush, width = _this$props4.width; var invert = function invert(x) { return x * (max - min) / width + min; }; onBrush(invert(sel0), invert(sel1)); } }, { key: "render", value: function render() { var _this2 = this; return _react["default"].createElement(StyledG, { className: "kg-range-slider__brush", innerRef: function innerRef(comp) { _this2.rootContainer = comp; } }); } }]); return RangeBrush; }(_react.Component); exports["default"] = RangeBrush; (0, _defineProperty2["default"])(RangeBrush, "propTypes", { domain: _propTypes["default"].arrayOf(_propTypes["default"].number).isRequired, onBrush: _propTypes["default"].func.isRequired, range: _propTypes["default"].arrayOf(_propTypes["default"].number).isRequired, value: _propTypes["default"].arrayOf(_propTypes["default"].number).isRequired, width: _propTypes["default"].number.isRequired }); ; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9yYW5nZS1icnVzaC5qcyJdLCJuYW1lcyI6WyJTdHlsZWRHIiwic3R5bGVkIiwiZyIsInByb3BzIiwidGhlbWUiLCJyYW5nZUJydXNoQmdkIiwiUmFuZ2VCcnVzaCIsInJhbmdlIiwibWluIiwibWF4IiwidmFsdWUiLCJ2YWwwIiwidmFsMSIsImJydXNoaW5nIiwibW92aW5nIiwicm9vdCIsInJvb3RDb250YWluZXIiLCJicnVzaCIsIm9uIiwiZXZlbnQiLCJzZWxlY3Rpb24iLCJfcmVzZXQiLCJfYnJ1c2giLCJjYWxsIiwicHJldlByb3BzIiwid2lkdGgiLCJwcmV2VmFsMCIsInByZXZWYWwxIiwiX21vdmUiLCJtb3ZlIiwibWluVmFsdWUiLCJtYXhWYWx1ZSIsIm9uQnJ1c2giLCJkb21haW4iLCJzY2FsZSIsIngiLCJzZWwwIiwic2VsMSIsImludmVydCIsImNvbXAiLCJDb21wb25lbnQiLCJQcm9wVHlwZXMiLCJhcnJheU9mIiwibnVtYmVyIiwiaXNSZXF1aXJlZCIsImZ1bmMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTUEsT0FBTyxHQUFHQyw2QkFBT0MsQ0FBVixvQkFHRCxVQUFBQyxLQUFLO0FBQUEsU0FBSUEsS0FBSyxDQUFDQyxLQUFOLENBQVlDLGFBQWhCO0FBQUEsQ0FISixDQUFiOztJQVFxQkMsVTs7Ozs7Ozs7Ozs7O3dDQVNDO0FBQUE7O0FBQUEsd0JBQytCLEtBQUtILEtBRHBDO0FBQUEsMEVBQ1hJLEtBRFc7QUFBQSxVQUNIQyxHQURHO0FBQUEsVUFDRUMsR0FERjtBQUFBLDBFQUNRQyxLQURSO0FBQUEsVUFDZ0JDLElBRGhCO0FBQUEsVUFDc0JDLElBRHRCLHlCQUVsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBLFdBQUtDLFFBQUwsR0FBZ0IsS0FB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VixDQUFrQkQsc0JBQVVFLE1BQTVCLEVBQW9DQyxVQUgxQjtBQUlqQmxDLEVBQUFBLEtBQUssRUFBRStCLHNCQUFVQyxPQUFWLENBQWtCRCxzQkFBVUUsTUFBNUIsRUFBb0NDLFVBSjFCO0FBS2pCbkIsRUFBQUEsS0FBSyxFQUFFZ0Isc0JBQVVFLE1BQVYsQ0FBaUJDO0FBTFAsQztBQTRGcEIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgUmVhY3QsIHtDb21wb25lbnR9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7ZXZlbnQsIHNlbGVjdH0gZnJvbSAnZDMtc2VsZWN0aW9uJztcbmltcG9ydCB7YnJ1c2hYfSBmcm9tICdkMy1icnVzaCc7XG5cbmNvbnN0IFN0eWxlZEcgPSBzdHlsZWQuZ2BcbiAgLnNlbGVjdGlvbiB7XG4gICAgc3Ryb2tlOiBub25lO1xuICAgIGZpbGw6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUucmFuZ2VCcnVzaEJnZH07XG4gICAgb3BhY2l0eTogMTtcbiAgfVxuYDtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFuZ2VCcnVzaCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBwcm9wVHlwZXMgPSB7XG4gICAgZG9tYWluOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMubnVtYmVyKS5pc1JlcXVpcmVkLFxuICAgIG9uQnJ1c2g6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgcmFuZ2U6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLmlzUmVxdWlyZWQsXG4gICAgdmFsdWU6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5udW1iZXIpLmlzUmVxdWlyZWQsXG4gICAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZFxuICB9O1xuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IHtyYW5nZTogW21pbiwgbWF4XSwgdmFsdWU6IFt2YWwwLCB2YWwxXX0gPSB0aGlzLnByb3BzO1xuICAgIC8vIFdlIHdhbnQgdGhlIFJlYWN0IGFwcCB0byByZXNwb25kIHRvIGJydXNoIHN0YXRlIGFuZCB2aWNlLXZlcnNhXG4gICAgLy8gYnV0IGQzLWJydXNoIGZpcmVzIHRoZSBzYW1lIGV2ZW50cyBmb3IgYm90aCB1c2VyLWluaXRpYXRlZCBicnVzaGluZ1xuICAgIC8vIGFuZCBwcm9ncmFtbWF0aWMgYnJ1c2hpbmcgKGJydXNoLm1vdmUpLiBXZSBuZWVkIHRoZXNlIGZsYWdzIHRvXG4gICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgdXNlcy5cbiAgICAvL1xuICAgIC8vIFdlIGRvbid0IHVzZSBzdGF0ZSBiZWNhdXNlIHRoYXQgd291bGQgdHJpZ2dlciBhbm90aGVyIGBjb21wb25lbnREaWRVcGF0ZWBcbiAgICB0aGlzLmJydXNoaW5nID0gZmFsc2U7XG4gICAgdGhpcy5tb3ZpbmcgPSBmYWxzZTtcblxuICAgIHRoaXMucm9vdCA9IHNlbGVjdCh0aGlzLnJvb3RDb250YWluZXIpO1xuICAgIHRoaXMuYnJ1c2ggPSBicnVzaFgoKVxuICAgICAgLm9uKCdzdGFydCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5icnVzaGluZyA9IHRydWU7XG4gICAgICB9KVxuICAgICAgLm9uKCdicnVzaCcsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMubW92aW5nKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQuc2VsZWN0aW9uID09PSBudWxsID8gdGhpcy5fcmVzZXQoKSA6IHRoaXMuX2JydXNoKGV2ZW50LnNlbGVjdGlvbik7XG4gICAgICB9KVxuICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tb3ZpbmcgJiYgZXZlbnQuc2VsZWN0aW9uID09PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fcmVzZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYnJ1c2hpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb3ZpbmcgPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yb290LmNhbGwodGhpcy5icnVzaCk7XG5cbiAgICBpZiAodmFsMCA9PT0gbWluICYmIHZhbDEgPT09IG1heCkge1xuICAgICAgdGhpcy5fcmVzZXQoKTtcbiAgICB9XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgY29uc3Qge3JhbmdlOiBbbWluLCBtYXhdLCB2YWx1ZTogW3ZhbDAsIHZhbDFdLCB3aWR0aH0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IFtwcmV2VmFsMCwgcHJldlZhbDFdID0gcHJldlByb3BzLnZhbHVlO1xuXG4gICAgaWYgKHByZXZQcm9wcy53aWR0aCAhPT0gd2lkdGgpIHtcbiAgICAgIHRoaXMucm9vdC5jYWxsKHRoaXMuYnJ1c2gpO1xuICAgICAgdGhpcy5fbW92ZSh2YWwwLCB2YWwxKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuYnJ1c2hpbmcgJiYgIXRoaXMubW92aW5nKSB7XG4gICAgICBpZiAodmFsMCA9PT0gbWluICYmIHZhbDEgPT09IG1heCkge1xuICAgICAgICB0aGlzLm1vdmluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuYnJ1c2gubW92ZSh0aGlzLnJvb3QsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJldlZhbDAgIT09IHZhbDAgfHwgcHJldlZhbDEgIT09IHZhbDEpIHtcbiAgICAgICAgdGhpcy5tb3ZpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLl9tb3ZlKHZhbDAsIHZhbDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9yZXNldCgpIHtcbiAgICBjb25zdCBbbWluVmFsdWUsIG1heFZhbHVlXSA9IHRoaXMucHJvcHMucmFuZ2U7XG4gICAgdGhpcy5wcm9wcy5vbkJydXNoKG1pblZhbHVlLCBtYXhWYWx1ZSk7XG4gIH1cblxuICBfbW92ZSh2YWwwLCB2YWwxKSB7XG4gICAgY29uc3Qge2RvbWFpbjogW21pbiwgbWF4XSwgd2lkdGh9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBzY2FsZSA9IHggPT4gKHggLSBtaW4pICogd2lkdGggLyAobWF4IC0gbWluKTtcbiAgICB0aGlzLmJydXNoLm1vdmUodGhpcy5yb290LCBbc2NhbGUodmFsMCksIHNjYWxlKHZhbDEpXSk7XG4gIH1cblxuICBfYnJ1c2goW3NlbDAsIHNlbDFdKSB7XG4gICAgY29uc3Qge2RvbWFpbjogW21pbiwgbWF4XSwgb25CcnVzaCwgd2lkdGh9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBpbnZlcnQgPSB4ID0+IHggKiAobWF4IC0gbWluKSAvIHdpZHRoICsgbWluO1xuICAgIG9uQnJ1c2goaW52ZXJ0KHNlbDApLCBpbnZlcnQoc2VsMSkpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiA8U3R5bGVkRyBjbGFzc05hbWU9XCJrZy1yYW5nZS1zbGlkZXJfX2JydXNoXCJcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJSZWY9e2NvbXAgPT4ge1xuICAgICAgdGhpcy5yb290Q29udGFpbmVyID0gY29tcDtcbiAgICB9fS8+O1xuICB9XG59O1xuIl19