UNPKG

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