@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
JavaScript
"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;