UNPKG

kepler.gl

Version:

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

141 lines (112 loc) 18.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getTickFormat = getTickFormat; exports.getXAxis = getXAxis; exports.updateAxis = updateAxis; exports["default"] = void 0; var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral")); var _react = _interopRequireWildcard(require("react")); var _momentTimezone = _interopRequireDefault(require("moment-timezone")); var _propTypes = _interopRequireDefault(require("prop-types")); var _d3Scale = require("d3-scale"); var _d3Selection = require("d3-selection"); var _d3Axis = require("d3-axis"); var _styledComponents = _interopRequireDefault(require("styled-components")); var _dataUtils = require("../../utils/data-utils"); var _templateObject; var MIN_TICK_WIDTH_LARGE = 80; var MIN_TICK_WIDTH_SMALL = 50; var HEIGHT = 30; var TimeSliderContainer = _styledComponents["default"].svg(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n pointer-events: none;\n position: absolute;\n top: 0;\n overflow: visible;\n margin-top: 6px;\n\n .axis text {\n font-size: ", ";\n fill: ", ";\n }\n\n .axis line,\n .axis path {\n fill: none;\n stroke: ", ";\n shape-rendering: crispEdges;\n stroke-width: 2;\n }\n\n .axis .domain {\n display: none;\n }\n\n .value {\n fill: ", ";\n font-size: ", ";\n\n &.start {\n text-anchor: start;\n }\n\n &.end {\n text-anchor: end;\n }\n }\n"])), function (props) { return props.theme.axisFontSize; }, function (props) { return props.theme.axisFontColor; }, function (props) { return props.theme.sliderBarBgd; }, function (props) { return props.theme.axisFontColor; }, function (props) { return props.theme.axisFontSize; }); var TICK_FORMATS = { millisecond: '.SSS', second: ':ss', minute: 'HH:ss', hour: 'HH A', day: 'ddd DD', week: 'MMM DD', month: 'MMM', year: 'YYYY' }; // timezone sensitive tick formatter based on moment // adapted based on d3 time scale tick format https://github.com/d3/d3-scale/blob/master/src/time.js#L59 function getTickFormat(timezone) { // date is js date object var toMoment = timezone ? function (date) { return (0, _momentTimezone["default"])(date).tz(timezone); } : _momentTimezone["default"]; var formatter = (0, _dataUtils.datetimeFormatter)(timezone); return function (date) { return (toMoment(date).startOf('second') < date ? formatter(TICK_FORMATS.millisecond) : toMoment(date).startOf('minute') < date ? formatter(TICK_FORMATS.second) : toMoment(date).startOf('hour') < date ? formatter(TICK_FORMATS.minute) : toMoment(date).startOf('day') < date ? formatter(TICK_FORMATS.hour) : toMoment(date).startOf('month') < date ? toMoment(date).startOf('isoWeek') < date ? formatter(TICK_FORMATS.day) : formatter(TICK_FORMATS.week) : toMoment(date).startOf('year') < date ? formatter(TICK_FORMATS.month) : formatter(TICK_FORMATS.year))(date); }; } // create a helper function so we can test it function getXAxis(domain, width, isEnlarged, timezone) { if (!Array.isArray(domain) || !domain.every(Number.isFinite)) { return null; } var scale = (0, _d3Scale.scaleUtc)().domain(domain).range([0, width]); if (!scale) { return null; } var ticks = Math.floor(width / (isEnlarged ? MIN_TICK_WIDTH_LARGE : MIN_TICK_WIDTH_SMALL)); var tickFormat = timezone ? getTickFormat(timezone) : null; var xAxis = (0, _d3Axis.axisBottom)(scale).ticks(ticks).tickSize(0).tickPadding(12); if (tickFormat) { xAxis.tickFormat(tickFormat); } return xAxis; } function updateAxis(xAxisRef, xAxis) { if (!xAxis) { return; } (0, _d3Selection.select)(xAxisRef.current).call(xAxis); } function TimeSliderMarkerFactory() { var TimeSliderMarker = function TimeSliderMarker(_ref) { var width = _ref.width, domain = _ref.domain, _ref$isEnlarged = _ref.isEnlarged, isEnlarged = _ref$isEnlarged === void 0 ? true : _ref$isEnlarged, _ref$height = _ref.height, height = _ref$height === void 0 ? HEIGHT : _ref$height, timezone = _ref.timezone; var xAxisRef = (0, _react.useRef)(null); var xAxis = (0, _react.useMemo)(function () { return getXAxis(domain, width, isEnlarged, timezone); }, [domain, width, isEnlarged, timezone]); (0, _react.useEffect)(function () { updateAxis(xAxisRef, xAxis); }, [xAxisRef, xAxis]); return /*#__PURE__*/_react["default"].createElement(TimeSliderContainer, { className: "time-slider-marker", width: width, height: height }, /*#__PURE__*/_react["default"].createElement("g", { className: "x axis", ref: xAxisRef, transform: "translate(0, 0)" })); }; TimeSliderMarker.propTypes = { domain: _propTypes["default"].arrayOf(_propTypes["default"].any).isRequired, width: _propTypes["default"].number.isRequired }; return /*#__PURE__*/_react["default"].memo(TimeSliderMarker); } var _default = TimeSliderMarkerFactory; exports["default"] = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi90aW1lLXNsaWRlci1tYXJrZXIuanMiXSwibmFtZXMiOlsiTUlOX1RJQ0tfV0lEVEhfTEFSR0UiLCJNSU5fVElDS19XSURUSF9TTUFMTCIsIkhFSUdIVCIsIlRpbWVTbGlkZXJDb250YWluZXIiLCJzdHlsZWQiLCJzdmciLCJwcm9wcyIsInRoZW1lIiwiYXhpc0ZvbnRTaXplIiwiYXhpc0ZvbnRDb2xvciIsInNsaWRlckJhckJnZCIsIlRJQ0tfRk9STUFUUyIsIm1pbGxpc2Vjb25kIiwic2Vjb25kIiwibWludXRlIiwiaG91ciIsImRheSIsIndlZWsiLCJtb250aCIsInllYXIiLCJnZXRUaWNrRm9ybWF0IiwidGltZXpvbmUiLCJ0b01vbWVudCIsImRhdGUiLCJ0eiIsIm1vbWVudCIsImZvcm1hdHRlciIsInN0YXJ0T2YiLCJnZXRYQXhpcyIsImRvbWFpbiIsIndpZHRoIiwiaXNFbmxhcmdlZCIsIkFycmF5IiwiaXNBcnJheSIsImV2ZXJ5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJzY2FsZSIsInJhbmdlIiwidGlja3MiLCJNYXRoIiwiZmxvb3IiLCJ0aWNrRm9ybWF0IiwieEF4aXMiLCJ0aWNrU2l6ZSIsInRpY2tQYWRkaW5nIiwidXBkYXRlQXhpcyIsInhBeGlzUmVmIiwiY3VycmVudCIsImNhbGwiLCJUaW1lU2xpZGVyTWFya2VyRmFjdG9yeSIsIlRpbWVTbGlkZXJNYXJrZXIiLCJoZWlnaHQiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJhcnJheU9mIiwiYW55IiwiaXNSZXF1aXJlZCIsIm51bWJlciIsIlJlYWN0IiwibWVtbyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLElBQU1BLG9CQUFvQixHQUFHLEVBQTdCO0FBQ0EsSUFBTUMsb0JBQW9CLEdBQUcsRUFBN0I7QUFDQSxJQUFNQyxN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aWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7dXNlUmVmLCB1c2VFZmZlY3QsIHVzZU1lbW99IGZyb20gJ3JlYWN0JztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge3NjYWxlVXRjfSBmcm9tICdkMy1zY2FsZSc7XG5pbXBvcnQge3NlbGVjdH0gZnJvbSAnZDMtc2VsZWN0aW9uJztcbmltcG9ydCB7YXhpc0JvdHRvbX0gZnJvbSAnZDMtYXhpcyc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJztcbmltcG9ydCB7ZGF0ZXRpbWVGb3JtYXR0ZXJ9IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuXG5jb25zdCBNSU5fVElDS19XSURUSF9MQVJHRSA9IDgwO1xuY29uc3QgTUlOX1RJQ0tfV0lEVEhfU01BTEwgPSA1MDtcbmNvbnN0IEhFSUdIVCA9IDMwO1xuXG5jb25zdCBUaW1lU2xpZGVyQ29udGFpbmVyID0gc3R5bGVkLnN2Z2BcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwO1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgbWFyZ2luLXRvcDogNnB4O1xuXG4gIC5heGlzIHRleHQge1xuICAgIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5heGlzRm9udFNpemV9O1xuICAgIGZpbGw6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuYXhpc0ZvbnRDb2xvcn07XG4gIH1cblxuICAuYXhpcyBsaW5lLFxuICAuYXhpcyBwYXRoIHtcbiAgICBmaWxsOiBub25lO1xuICAgIHN0cm9rZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5zbGlkZXJCYXJCZ2R9O1xuICAgIHNoYXBlLXJlbmRlcmluZzogY3Jpc3BFZGdlcztcbiAgICBzdHJva2Utd2lkdGg6IDI7XG4gIH1cblxuICAuYXhpcyAuZG9tYWluIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgLnZhbHVlIHtcbiAgICBmaWxsOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmF4aXNGb250Q29sb3J9O1xuICAgIGZvbnQtc2l6ZTogJHtwcm9wcyA9PiBwcm9wcy50aGVtZS5heGlzRm9udFNpemV9O1xuXG4gICAgJi5zdGFydCB7XG4gICAgICB0ZXh0LWFuY2hvcjogc3RhcnQ7XG4gICAgfVxuXG4gICAgJi5lbmQge1xuICAgICAgdGV4dC1hbmNob3I6IGVuZDtcbiAgICB9XG4gIH1cbmA7XG5cbmNvbnN0IFRJQ0tfRk9STUFUUyA9IHtcbiAgbWlsbGlzZWNvbmQ6ICcuU1NTJyxcbiAgc2Vjb25kOiAnOnNzJyxcbiAgbWludXRlOiAnSEg6c3MnLFxuICBob3VyOiAnSEggQScsXG4gIGRheTogJ2RkZCBERCcsXG4gIHdlZWs6ICdNTU0gREQnLFxuICBtb250aDogJ01NTScsXG4gIHllYXI6ICdZWVlZJ1xufTtcblxuLy8gdGltZXpvbmUgc2Vuc2l0aXZlIHRpY2sgZm9ybWF0dGVyIGJhc2VkIG9uIG1vbWVudFxuLy8gYWRhcHRlZCBiYXNlZCBvbiBkMyB0aW1lIHNjYWxlIHRpY2sgZm9ybWF0IGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1zY2FsZS9ibG9iL21hc3Rlci9zcmMvdGltZS5qcyNMNTlcbmV4cG9ydCBmdW5jdGlvbiBnZXRUaWNrRm9ybWF0KHRpbWV6b25lKSB7XG4gIC8vIGRhdGUgaXMganMgZGF0ZSBvYmplY3RcbiAgY29uc3QgdG9Nb21lbnQgPSB0aW1lem9uZSA/IGRhdGUgPT4gbW9tZW50KGRhdGUpLnR6KHRpbWV6b25lKSA6IG1vbWVudDtcbiAgY29uc3QgZm9ybWF0dGVyID0gZGF0ZXRpbWVGb3JtYXR0ZXIodGltZXpvbmUpO1xuXG4gIHJldHVybiBkYXRlID0+XG4gICAgKHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ3NlY29uZCcpIDwgZGF0ZVxuICAgICAgPyBmb3JtYXR0ZXIoVElDS19GT1JNQVRTLm1pbGxpc2Vjb25kKVxuICAgICAgOiB0b01vbWVudChkYXRlKS5zdGFydE9mKCdtaW51dGUnKSA8IGRhdGVcbiAgICAgID8gZm9ybWF0dGVyKFRJQ0tfRk9STUFUUy5zZWNvbmQpXG4gICAgICA6IHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ2hvdXInKSA8IGRhdGVcbiAgICAgID8gZm9ybWF0dGVyKFRJQ0tfRk9STUFUUy5taW51dGUpXG4gICAgICA6IHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ2RheScpIDwgZGF0ZVxuICAgICAgPyBmb3JtYXR0ZXIoVElDS19GT1JNQVRTLmhvdXIpXG4gICAgICA6IHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ21vbnRoJykgPCBkYXRlXG4gICAgICA/IHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ2lzb1dlZWsnKSA8IGRhdGVcbiAgICAgICAgPyBmb3JtYXR0ZXIoVElDS19GT1JNQVRTLmRheSlcbiAgICAgICAgOiBmb3JtYXR0ZXIoVElDS19GT1JNQVRTLndlZWspXG4gICAgICA6IHRvTW9tZW50KGRhdGUpLnN0YXJ0T2YoJ3llYXInKSA8IGRhdGVcbiAgICAgID8gZm9ybWF0dGVyKFRJQ0tfRk9STUFUUy5tb250aClcbiAgICAgIDogZm9ybWF0dGVyKFRJQ0tfRk9STUFUUy55ZWFyKSkoZGF0ZSk7XG59XG5cbi8vIGNyZWF0ZSBhIGhlbHBlciBmdW5jdGlvbiBzbyB3ZSBjYW4gdGVzdCBpdFxuZXhwb3J0IGZ1bmN0aW9uIGdldFhBeGlzKGRvbWFpbiwgd2lkdGgsIGlzRW5sYXJnZWQsIHRpbWV6b25lKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkb21haW4pIHx8ICFkb21haW4uZXZlcnkoTnVtYmVyLmlzRmluaXRlKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHNjYWxlID0gc2NhbGVVdGMoKVxuICAgIC5kb21haW4oZG9tYWluKVxuICAgIC5yYW5nZShbMCwgd2lkdGhdKTtcbiAgaWYgKCFzY2FsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdGlja3MgPSBNYXRoLmZsb29yKHdpZHRoIC8gKGlzRW5sYXJnZWQgPyBNSU5fVElDS19XSURUSF9MQVJHRSA6IE1JTl9USUNLX1dJRFRIX1NNQUxMKSk7XG4gIGNvbnN0IHRpY2tGb3JtYXQgPSB0aW1lem9uZSA/IGdldFRpY2tGb3JtYXQodGltZXpvbmUpIDogbnVsbDtcbiAgY29uc3QgeEF4aXMgPSBheGlzQm90dG9tKHNjYWxlKVxuICAgIC50aWNrcyh0aWNrcylcbiAgICAudGlja1NpemUoMClcbiAgICAudGlja1BhZGRpbmcoMTIpO1xuICBpZiAodGlja0Zvcm1hdCkge1xuICAgIHhBeGlzLnRpY2tGb3JtYXQodGlja0Zvcm1hdCk7XG4gIH1cblxuICByZXR1cm4geEF4aXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBeGlzKHhBeGlzUmVmLCB4QXhpcykge1xuICBpZiAoIXhBeGlzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc2VsZWN0KHhBeGlzUmVmLmN1cnJlbnQpLmNhbGwoeEF4aXMpO1xufVxuXG5mdW5jdGlvbiBUaW1lU2xpZGVyTWFya2VyRmFjdG9yeSgpIHtcbiAgY29uc3QgVGltZVNsaWRlck1hcmtlciA9ICh7d2lkdGgsIGRvbWFpbiwgaXNFbmxhcmdlZCA9IHRydWUsIGhlaWdodCA9IEhFSUdIVCwgdGltZXpvbmV9KSA9PiB7XG4gICAgY29uc3QgeEF4aXNSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3QgeEF4aXMgPSB1c2VNZW1vKCgpID0+IGdldFhBeGlzKGRvbWFpbiwgd2lkdGgsIGlzRW5sYXJnZWQsIHRpbWV6b25lKSwgW1xuICAgICAgZG9tYWluLFxuICAgICAgd2lkdGgsXG4gICAgICBpc0VubGFyZ2VkLFxuICAgICAgdGltZXpvbmVcbiAgICBdKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgdXBkYXRlQXhpcyh4QXhpc1JlZiwgeEF4aXMpO1xuICAgIH0sIFt4QXhpc1JlZiwgeEF4aXNdKTtcbiAgICByZXR1cm4gKFxuICAgICAgPFRpbWVTbGlkZXJDb250YWluZXIgY2xhc3NOYW1lPVwidGltZS1zbGlkZXItbWFya2VyXCIgd2lkdGg9e3dpZHRofSBoZWlnaHQ9e2hlaWdodH0+XG4gICAgICAgIDxnIGNsYXNzTmFtZT1cInggYXhpc1wiIHJlZj17eEF4aXNSZWZ9IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwLCAwKVwiIC8+XG4gICAgICA8L1RpbWVTbGlkZXJDb250YWluZXI+XG4gICAgKTtcbiAgfTtcblxuICBUaW1lU2xpZGVyTWFya2VyLnByb3BUeXBlcyA9IHtcbiAgICBkb21haW46IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5hbnkpLmlzUmVxdWlyZWQsXG4gICAgd2lkdGg6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZFxuICB9O1xuXG4gIHJldHVybiBSZWFjdC5tZW1vKFRpbWVTbGlkZXJNYXJrZXIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBUaW1lU2xpZGVyTWFya2VyRmFjdG9yeTtcbiJdfQ==