@uiw/react-heat-map
Version:
React component create calendar heatmap to visualize time series data, a la github contribution graph.
189 lines (163 loc) • 7.44 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 _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _LablesWeek = require("./LablesWeek");
var _LablesMonth = require("./LablesMonth");
var _Rect = require("./Rect");
var _utils = require("./utils");
var _Legend = _interopRequireDefault(require("./Legend"));
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["rectSize", "legendCellSize", "space", "startDate", "endDate", "rectProps", "rectRender", "legendRender", "value", "weekLables", "monthLables", "panelColors"];
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$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$weekLables = _ref.weekLables,
weekLables = _ref$weekLables === void 0 ? ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] : _ref$weekLables,
_ref$monthLables = _ref.monthLables,
monthLables = _ref$monthLables === void 0 ? ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] : _ref$monthLables,
_ref$panelColors = _ref.panelColors,
panelColors = _ref$panelColors === void 0 ? {
0: '#EBEDF0',
8: '#7BC96F',
4: '#C6E48B',
12: '#239A3B',
32: '#196127'
} : _ref$panelColors,
other = (0, _objectWithoutProperties2.default)(_ref, _excluded);
var _useState = (0, _react.useState)(0),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
gridNum = _useState2[0],
setGridNum = _useState2[1];
var _useState3 = (0, _react.useState)(!!weekLables ? 28 : 5),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
leftPad = _useState4[0],
setLeftPad = _useState4[1];
var _useState5 = (0, _react.useState)(!!monthLables ? 20 : 5),
_useState6 = (0, _slicedToArray2.default)(_useState5, 2),
topPad = _useState6[0],
setTopPad = _useState6[1];
var svgRef = /*#__PURE__*/_react.default.createRef();
var nums = (0, _react.useMemo)(function () {
return (0, _utils.numberSort)(Object.keys(panelColors).map(function (item) {
return parseInt(item, 10);
}));
}, [panelColors]);
var data = (0, _react.useMemo)(function () {
return (0, _utils.formatData)(value);
}, [value]);
(0, _react.useEffect)(function () {
return setLeftPad(!!weekLables ? 28 : 5);
}, [weekLables]);
(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(!!monthLables ? 20 : 5);
}, [monthLables]);
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]);
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("svg", (0, _objectSpread2.default)((0, _objectSpread2.default)({
ref: svgRef
}, other), {}, {
children: [legendCellSize !== 0 && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Legend.default, {
legendRender: legendRender,
panelColors: panelColors,
rectSize: rectSize,
legendCellSize: legendCellSize,
leftPad: leftPad,
topPad: topPad,
space: space
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_LablesWeek.LablesWeek, {
weekLables: weekLables,
rectSize: rectSize,
space: space,
topPad: topPad
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_LablesMonth.LablesMonth, {
monthLables: monthLables,
rectSize: rectSize,
space: space,
leftPad: leftPad,
colNum: gridNum,
startDate: initStartDate
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("g", {
transform: "translate(".concat(leftPad, ", ").concat(topPad, ")"),
children: gridNum > 0 && (0, _toConsumableArray2.default)(Array(gridNum)).map(function (_, idx) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("g", {
"data-column": idx,
children: (0, _toConsumableArray2.default)(Array(7)).map(function (_, cidx) {
var dayProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, rectProps), {}, {
key: cidx,
fill: '#EBEDF0',
width: rectSize,
height: rectSize,
x: idx * (rectSize + space),
y: (rectSize + space) * cidx
});
var currentDate = new Date(initStartDate.getTime() + _utils.oneDayTime * (idx * 7 + cidx));
var date = (0, _utils.getDateToString)(currentDate);
var dataProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, data[date]), {}, {
date: date,
row: cidx,
column: idx,
index: idx * 7 + cidx
});
if (endDate instanceof Date && currentDate.getTime() > endDate.getTime()) {
return null;
}
if (date && data[date] && panelColors && Object.keys(panelColors).length > 0) {
dayProps.fill = (0, _utils.existColor)(data[date].count || 0, nums, panelColors);
} else if (panelColors && panelColors[0]) {
dayProps.fill = panelColors[0];
}
if (rectRender && typeof rectRender === 'function') {
var elm = rectRender((0, _objectSpread2.default)((0, _objectSpread2.default)({}, dayProps), {}, {
key: cidx
}), dataProps);
if (elm && /*#__PURE__*/_react.default.isValidElement(elm)) {
return elm;
}
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Rect.Rect, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, dayProps), {}, {
"data-date": date,
"data-index": dataProps.index,
"data-row": dataProps.row,
"data-column": dataProps.column
}));
})
}, idx);
})
})]
}));
}
//# sourceMappingURL=SVG.js.map