UNPKG

@uiw/react-heat-map

Version:

React component create calendar heatmap to visualize time series data, a la github contribution graph.

134 lines (133 loc) 6.19 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"]; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = SVG; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _react = _interopRequireWildcard(require("react")); var _LabelsWeek = require("./LabelsWeek"); var _LabelsMonth = require("./LabelsMonth"); var _utils = require("./utils"); var _Legend = _interopRequireDefault(require("./Legend")); var _Day = require("./Day"); var _jsxRuntime = require("react/jsx-runtime"); var _excluded = ["rectSize", "legendCellSize", "space", "monthPlacement", "startDate", "endDate", "rectProps", "rectRender", "legendRender", "value", "weekLabels", "monthLabels", "panelColors", "style"]; function SVG(props) { var _ref = props || {}, _ref$rectSize = _ref.rectSize, rectSize = _ref$rectSize === void 0 ? 11 : _ref$rectSize, _ref$legendCellSize = _ref.legendCellSize, legendCellSize = _ref$legendCellSize === void 0 ? 11 : _ref$legendCellSize, _ref$space = _ref.space, space = _ref$space === void 0 ? 2 : _ref$space, _ref$monthPlacement = _ref.monthPlacement, monthPlacement = _ref$monthPlacement === void 0 ? 'top' : _ref$monthPlacement, _ref$startDate = _ref.startDate, startDate = _ref$startDate === void 0 ? new Date() : _ref$startDate, endDate = _ref.endDate, rectProps = _ref.rectProps, rectRender = _ref.rectRender, legendRender = _ref.legendRender, _ref$value = _ref.value, value = _ref$value === void 0 ? [] : _ref$value, _ref$weekLabels = _ref.weekLabels, weekLabels = _ref$weekLabels === void 0 ? ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] : _ref$weekLabels, _ref$monthLabels = _ref.monthLabels, monthLabels = _ref$monthLabels === void 0 ? ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] : _ref$monthLabels, _ref$panelColors = _ref.panelColors, panelColors = _ref$panelColors === void 0 ? ['var(--rhm-rect, #EBEDF0)', '#C6E48B', '#7BC96F', '#239A3B', '#196127'] : _ref$panelColors, style = _ref.style, other = (0, _objectWithoutProperties2["default"])(_ref, _excluded); var maxCount = Math.max.apply(Math, (0, _toConsumableArray2["default"])(value.map(function (item) { return item.count; })).concat([0])); var panelColorsObject = Array.isArray(panelColors) ? (0, _utils.convertPanelColors)(panelColors, maxCount) : panelColors; var _useState = (0, _react.useState)(0), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), gridNum = _useState2[0], setGridNum = _useState2[1]; var _useState3 = (0, _react.useState)(!!weekLabels ? 28 : 5), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), leftPad = _useState4[0], setLeftPad = _useState4[1]; var defaultTopPad = monthPlacement === 'top' ? 20 : 5; var _useState5 = (0, _react.useState)(!!monthLabels ? defaultTopPad : 5), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), topPad = _useState6[0], setTopPad = _useState6[1]; var svgRef = /*#__PURE__*/_react["default"].createRef(); (0, _react.useEffect)(function () { return setLeftPad(!!weekLabels ? 28 : 5); }, [weekLabels]); (0, _react.useEffect)(function () { if (svgRef.current) { var width = svgRef.current.clientWidth - leftPad || 0; setGridNum(Math.floor(width / (rectSize + space)) || 0); } }, [rectSize, svgRef, space, leftPad]); (0, _react.useEffect)(function () { setTopPad(!!monthLabels ? defaultTopPad : 5); }, [monthLabels]); var initStartDate = (0, _react.useMemo)(function () { if ((0, _utils.isValidDate)(startDate)) { return !startDate.getDay() ? startDate : new Date(startDate.getTime() - startDate.getDay() * _utils.oneDayTime); } else { var newDate = new Date(); return new Date(newDate.getTime() - newDate.getDay() * _utils.oneDayTime); } }, [startDate]); var styl = { color: 'var(--rhm-text-color, #24292e)', userSelect: 'none', display: 'block', fontSize: 10 }; var monthRectY = monthPlacement === 'top' ? 15 : 15 * 7 + space; var legendTopPad = monthPlacement === 'top' ? topPad + rectSize * 8 + 6 : (!!monthLabels ? topPad + rectSize + space : topPad) + rectSize * 8 + 6; return /*#__PURE__*/(0, _jsxRuntime.jsxs)("svg", (0, _objectSpread2["default"])((0, _objectSpread2["default"])({ ref: svgRef, style: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, styl), style) }, other), {}, { children: [legendCellSize !== 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Legend["default"], { legendRender: legendRender, panelColors: panelColorsObject, rectSize: rectSize, rectY: legendTopPad, legendCellSize: legendCellSize, leftPad: leftPad, topPad: topPad, space: space }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_LabelsWeek.LabelsWeek, { weekLabels: weekLabels, rectSize: rectSize, space: space, topPad: topPad }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_LabelsMonth.LabelsMonth, { monthLabels: monthLabels, rectSize: rectSize, space: space, leftPad: leftPad, colNum: gridNum, rectY: monthRectY, startDate: initStartDate, endDate: endDate }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Day.Day, { transform: "translate(".concat(leftPad, ", ").concat(topPad, ")"), gridNum: gridNum, initStartDate: initStartDate, endDate: endDate, rectProps: rectProps, rectSize: rectSize, rectRender: rectRender, panelColors: panelColorsObject, value: value, space: space })] })); } module.exports = exports.default;