UNPKG

react-grid-heatmap

Version:

A react component for heatmap visualisation in grid layout

260 lines (238 loc) 7.86 kB
import React__default, { createElement } from 'react'; function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } var noop = function noop(returnVal) { return function () { return returnVal; }; }; var Cell = function Cell(_ref) { var _ref$render = _ref.render, render = _ref$render === void 0 ? noop(null) : _ref$render, _ref$style = _ref.style, style = _ref$style === void 0 ? noop({}) : _ref$style, ratio = _ref.ratio, posX = _ref.posX, posY = _ref.posY, _ref$square = _ref.square, square = _ref$square === void 0 ? false : _ref$square, _ref$height = _ref.height, height = _ref$height === void 0 ? '2rem' : _ref$height, value = _ref.value, _onClick = _ref.onClick; return /*#__PURE__*/React__default.createElement("div", { onClick: function onClick() { return (_onClick || noop({}))(posX, posY); }, style: _extends({ border: '1px solid #fff', borderWidth: '1px 1px 0 0', textAlign: 'center', color: "rgb(0, 0, 0, " + (ratio / 2 + 0.4) + ")", overflow: 'hidden', boxSizing: 'border-box', flexGrow: square ? 0 : 1, flexBasis: square ? height : 0, flexShrink: 0, height: height, lineHeight: height, borderRadius: '4px', fontSize: '.8rem', cursor: _onClick ? 'pointer' : 'initial', background: "rgb(12, 160, 44, " + (ratio + 0.05) + ")" }, style(posX, posY, ratio)) }, render(posX, posY, value)); }; var Cell$1 = React__default.memo(Cell); function Row(_ref) { var children = _ref.children, _ref$reverse = _ref.reverse, reverse = _ref$reverse === void 0 ? false : _ref$reverse; return /*#__PURE__*/React__default.createElement("div", { style: { display: 'flex', flexDirection: reverse ? 'row-reverse' : 'row', justifyContent: reverse ? 'flex-end' : 'initial' } }, children); } function XLabels(_ref) { var labels = _ref.labels, _ref$xLabelsStyle = _ref.xLabelsStyle, xLabelsStyle = _ref$xLabelsStyle === void 0 ? function () { return {}; } : _ref$xLabelsStyle, height = _ref.height, _ref$square = _ref.square, square = _ref$square === void 0 ? false : _ref$square; var widthPercent = 100 / labels.length + "%"; return /*#__PURE__*/React__default.createElement("div", { style: { display: 'flex', textAlign: 'center' } }, labels.map(function (label, index) { return /*#__PURE__*/React__default.createElement("div", { key: label + "-" + index, style: _extends({ padding: '0.2rem 0', boxSizing: 'border-box', flexGrow: square ? 'initial' : 1, overflow: 'hidden', flexShrink: 1, flexBasis: square ? height : widthPercent, width: square ? height : widthPercent }, xLabelsStyle(index)) }, label); })); } function Column(_ref) { var children = _ref.children, _ref$grow = _ref.grow, grow = _ref$grow === void 0 ? false : _ref$grow, _ref$reverse = _ref.reverse, reverse = _ref$reverse === void 0 ? false : _ref$reverse; return /*#__PURE__*/React__default.createElement("div", { style: { display: 'flex', flexDirection: reverse ? 'column-reverse' : 'column', flexGrow: grow ? 1 : 0 } }, children); } function YLabels(_ref) { var labels = _ref.labels, height = _ref.height, _ref$yLabelsStyle = _ref.yLabelsStyle, yLabelsStyle = _ref$yLabelsStyle === void 0 ? function () { return {}; } : _ref$yLabelsStyle, _ref$reverse = _ref.reverse, reverse = _ref$reverse === void 0 ? false : _ref$reverse; return /*#__PURE__*/React__default.createElement("div", { style: { display: 'flex', flexDirection: 'column', textAlign: reverse ? 'left' : 'right' } }, labels.map(function (label, index) { return /*#__PURE__*/React__default.createElement("div", { key: label, style: _extends({ boxSizing: 'border-box', padding: '0 0.2rem', lineHeight: height }, yLabelsStyle(index)) }, label); })); } function YLabelAligner(_ref) { var _style; var xLabelHeight = _ref.xLabelHeight, isXLabelReverse = _ref.isXLabelReverse, children = _ref.children; var style = (_style = {}, _style[isXLabelReverse ? 'marginBottom' : 'marginTop'] = xLabelHeight + "px", _style); return /*#__PURE__*/React__default.createElement("div", { style: style }, children); } function useElementHeight(initHeight) { var eleRef = React__default.useRef(null); var _React$useState = React__default.useState(initHeight), eleHeight = _React$useState[0], setEleHeight = _React$useState[1]; React__default.useEffect(function () { if (eleRef.current) { var height = (eleRef.current || {}).clientHeight; setEleHeight(height); } }, []); return [eleHeight, eleRef]; } function getMinMax(data) { var flatArray = data.reduce(function (i, o) { return [].concat(o, i); }, []); var max = Math.max.apply(Math, flatArray); var min = Math.min.apply(Math, flatArray); return [min, max]; } var HeatMapGrid = function HeatMapGrid(_ref) { var data = _ref.data, xLabels = _ref.xLabels, yLabels = _ref.yLabels, _ref$xLabelsPos = _ref.xLabelsPos, xLabelsPos = _ref$xLabelsPos === void 0 ? 'top' : _ref$xLabelsPos, _ref$yLabelsPos = _ref.yLabelsPos, yLabelsPos = _ref$yLabelsPos === void 0 ? 'left' : _ref$yLabelsPos, _ref$square = _ref.square, square = _ref$square === void 0 ? false : _ref$square, _ref$cellHeight = _ref.cellHeight, cellHeight = _ref$cellHeight === void 0 ? '2px' : _ref$cellHeight, xLabelsStyle = _ref.xLabelsStyle, yLabelsStyle = _ref.yLabelsStyle, cellStyle = _ref.cellStyle, cellRender = _ref.cellRender, onClick = _ref.onClick; var _useElementHeight = useElementHeight(22), xLabelHeight = _useElementHeight[0], xLabelRef = _useElementHeight[1]; var _getMinMax = getMinMax(data), min = _getMinMax[0], max = _getMinMax[1]; var minMaxDiff = max - min; var isXLabelReverse = xLabelsPos === 'bottom'; var isYLabelReverse = yLabelsPos === 'right'; return /*#__PURE__*/createElement(Row, { reverse: isYLabelReverse }, yLabels && /*#__PURE__*/createElement(YLabelAligner, { xLabelHeight: xLabelHeight, isXLabelReverse: isXLabelReverse }, /*#__PURE__*/createElement(YLabels, { reverse: isYLabelReverse, labels: yLabels, height: cellHeight, yLabelsStyle: yLabelsStyle })), /*#__PURE__*/createElement(Column, { reverse: isXLabelReverse, grow: !square }, /*#__PURE__*/createElement("div", { ref: xLabelRef }, xLabels && /*#__PURE__*/createElement(XLabels, { labels: xLabels, xLabelsStyle: xLabelsStyle, height: cellHeight, square: square })), /*#__PURE__*/createElement(Column, null, data.map(function (rowItems, xi) { return /*#__PURE__*/createElement(Row, { key: xi }, rowItems.map(function (value, yi) { return /*#__PURE__*/createElement(Cell$1, { key: xi + "-" + yi, posX: xi, posY: yi, onClick: onClick, value: value, height: cellHeight, square: square, render: cellRender, style: cellStyle, ratio: (value - min) / minMaxDiff }); })); })))); }; export { HeatMapGrid }; //# sourceMappingURL=index.modern.js.map