UNPKG

@alicloud/cloud-charts

Version:

![](https://img.shields.io/npm/v/@alicloud/cloud-charts?color=%23ff8200)

150 lines (133 loc) 9.78 kB
import _extends from "@babel/runtime/helpers/extends"; import React, { useRef, useEffect, useState } from 'react'; import themes from '../../themes/index'; import Wnumber from '../../Wnumber'; import "./index.css"; function getClipPath(width, height) { return ['M0,10', "Q" + 0.125 * width + "," + height + " " + 0.25 * width + "," + height / 4, "Q" + 0.375 * width + "," + -height / 4 + " " + 0.5 * width + "," + height / 2, "Q" + 0.625 * width + "," + height + " " + 0.75 * width + "," + height / 4, "Q" + 0.875 * width + "," + -height / 4 + " " + width + "," + height / 2, "L" + width + ",0", "L" + width + "," + height, "L0," + height, 'L0,0', 'Z'].join(' '); } function PercentBar(props) { var _translateStartColor, _config$guide$status3, _config$guide4, _config$guide$thresho2, _config$guide5, _config$guide$status4, _config$guide6, _config$guide$status5, _config$guide7, _config$guide$status6, _config$guide8, _config$guide$thresho3, _config$guide9, _config$percentConfig, _config$labelConfig; var data = props.data, config = props.config, prefix = props.prefix; var ref = useRef(null); var _useState = useState(0), width = _useState[0], setWidth = _useState[1]; useEffect(function () { var timer; var handleResize = function handleResize() { clearTimeout(timer); timer = setTimeout(function () { var _ref$current$clientWi, _ref$current; if (!ref.current) return; var waterWidth = (_ref$current$clientWi = ref === null || ref === void 0 ? void 0 : (_ref$current = ref.current) === null || _ref$current === void 0 ? void 0 : _ref$current.clientWidth) !== null && _ref$current$clientWi !== void 0 ? _ref$current$clientWi : 0; setWidth(waterWidth); }, 0); }; handleResize(); window.addEventListener('resize', handleResize, false); return function () { clearTimeout(timer); window.removeEventListener('resize', handleResize, false); }; }, [ref]); // 默认态是图表主色 var statusColors = { normal: themes['widgets-capacity-color-grey'], // 平常态是灰色 success: themes['widgets-color-green'], warning: themes['widgets-color-orange'], error: themes['widgets-color-red'] }; var translateStartColor = function translateStartColor(data, config) { if (data.percent.displayNumber === 0) { return { status: 'empty', color: themes['widgets-tooltip-cross-line'] }; } else if (config !== null && config !== void 0 && config.guide) { var _ref, _config$guide$thresho, _config$guide; var threshold = Number((_ref = (_config$guide$thresho = config === null || config === void 0 ? void 0 : (_config$guide = config.guide) === null || _config$guide === void 0 ? void 0 : _config$guide.threshold) !== null && _config$guide$thresho !== void 0 ? _config$guide$thresho : '80%') === null || _ref === void 0 ? void 0 : _ref.replace('%', '')); if (data.percent.displayNumber >= threshold) { var _config$guide$status, _config$guide2, _config$guide$status2, _config$guide3; return { status: (_config$guide$status = config === null || config === void 0 ? void 0 : (_config$guide2 = config.guide) === null || _config$guide2 === void 0 ? void 0 : _config$guide2.status) !== null && _config$guide$status !== void 0 ? _config$guide$status : 'error', color: statusColors[(_config$guide$status2 = config === null || config === void 0 ? void 0 : (_config$guide3 = config.guide) === null || _config$guide3 === void 0 ? void 0 : _config$guide3.status) !== null && _config$guide$status2 !== void 0 ? _config$guide$status2 : 'error'] }; } else { var _Object$keys; return { status: (_Object$keys = Object.keys(statusColors)) !== null && _Object$keys !== void 0 && _Object$keys.includes(config === null || config === void 0 ? void 0 : config.startColor) ? config === null || config === void 0 ? void 0 : config.startColor : 'default', color: statusColors[config === null || config === void 0 ? void 0 : config.startColor] || (config === null || config === void 0 ? void 0 : config.startColor) || themes['widgets-color-category-1'] }; } } else { var _Object$keys2; return { status: (_Object$keys2 = Object.keys(statusColors)) !== null && _Object$keys2 !== void 0 && _Object$keys2.includes(config === null || config === void 0 ? void 0 : config.startColor) ? config === null || config === void 0 ? void 0 : config.startColor : 'default', color: statusColors[config === null || config === void 0 ? void 0 : config.startColor] || (config === null || config === void 0 ? void 0 : config.startColor) || themes['widgets-color-category-1'] }; } }; return /*#__PURE__*/React.createElement("div", { className: prefix + "-percent-container", style: _extends({ width: (config === null || config === void 0 ? void 0 : config.barSize) || '100%' }, config === null || config === void 0 ? void 0 : config.percentConfig), ref: ref }, /*#__PURE__*/React.createElement("div", { className: prefix + "-bar-container " + ((_translateStartColor = translateStartColor(data, config)) === null || _translateStartColor === void 0 ? void 0 : _translateStartColor.status), style: config === null || config === void 0 ? void 0 : config.barConfig }, (config === null || config === void 0 ? void 0 : config.guide) && /*#__PURE__*/React.createElement("div", { className: prefix + "-bar-guide-line " + ((_config$guide$status3 = config === null || config === void 0 ? void 0 : (_config$guide4 = config.guide) === null || _config$guide4 === void 0 ? void 0 : _config$guide4.status) !== null && _config$guide$status3 !== void 0 ? _config$guide$status3 : 'error'), style: { height: (_config$guide$thresho2 = config === null || config === void 0 ? void 0 : (_config$guide5 = config.guide) === null || _config$guide5 === void 0 ? void 0 : _config$guide5.threshold) !== null && _config$guide$thresho2 !== void 0 ? _config$guide$thresho2 : '80%', borderTopColor: statusColors[(_config$guide$status4 = config === null || config === void 0 ? void 0 : (_config$guide6 = config.guide) === null || _config$guide6 === void 0 ? void 0 : _config$guide6.status) !== null && _config$guide$status4 !== void 0 ? _config$guide$status4 : 'error'] } }, /*#__PURE__*/React.createElement(Wnumber, { className: prefix + "-bar-guide-text " + ((_config$guide$status5 = config === null || config === void 0 ? void 0 : (_config$guide7 = config.guide) === null || _config$guide7 === void 0 ? void 0 : _config$guide7.status) !== null && _config$guide$status5 !== void 0 ? _config$guide$status5 : 'error'), style: { color: statusColors[(_config$guide$status6 = config === null || config === void 0 ? void 0 : (_config$guide8 = config.guide) === null || _config$guide8 === void 0 ? void 0 : _config$guide8.status) !== null && _config$guide$status6 !== void 0 ? _config$guide$status6 : 'error'] } }, (_config$guide$thresho3 = config === null || config === void 0 ? void 0 : (_config$guide9 = config.guide) === null || _config$guide9 === void 0 ? void 0 : _config$guide9.threshold) !== null && _config$guide$thresho3 !== void 0 ? _config$guide$thresho3 : '-')), /*#__PURE__*/React.createElement("div", { className: prefix + "-process-bar", style: _extends({ width: (config === null || config === void 0 ? void 0 : config.barSize) || (config === null || config === void 0 ? void 0 : (_config$percentConfig = config.percentConfig) === null || _config$percentConfig === void 0 ? void 0 : _config$percentConfig.width) || '100%', height: data.percent.displayNumber === 0 || data.percent.displayNumber === '-' ? '15px' : "calc(" + data.percent.displayNumber + "% + 15px)" }, config === null || config === void 0 ? void 0 : config.processBarConfig) }, /*#__PURE__*/React.createElement("div", { className: prefix + "-process-back", style: _extends({ background: "linear-gradient(180deg, transparent 19px, " + translateStartColor(data, config).color + " 0%, " + ((config === null || config === void 0 ? void 0 : config.endColor) || 'rgba(0,0,0,0)') + " 100%)" }, config === null || config === void 0 ? void 0 : config.processBarBackConfig) }, /*#__PURE__*/React.createElement("svg", { className: "process-svg", width: "100%", height: 20, version: "1.1", xmlns: "http://www.w3.org/2000/svg" }, /*#__PURE__*/React.createElement("g", { stroke: "none", strokeWidth: "1", fill: "none", fillRule: "evenodd" }, /*#__PURE__*/React.createElement("path", { d: getClipPath(width * 2, 20), fill: translateStartColor(data, config).color, opacity: "0.5", transform: "translate(" + -0.5 * width + ",0)" }), /*#__PURE__*/React.createElement("path", { d: getClipPath(width * 2, 20), fill: translateStartColor(data, config).color }))))), /*#__PURE__*/React.createElement(Wnumber, { className: prefix + "-percent-bar-label-content " + ((config === null || config === void 0 ? void 0 : config.size) || 'medium'), style: config === null || config === void 0 ? void 0 : config.labelConfig }, data.percent.displayNumber, /*#__PURE__*/React.createElement("span", { className: prefix + "-percent-bar-label-unit" }, (config === null || config === void 0 ? void 0 : (_config$labelConfig = config.labelConfig) === null || _config$labelConfig === void 0 ? void 0 : _config$labelConfig.unit) || '%')), /*#__PURE__*/React.createElement("div", { className: prefix + "-percent-bar-label-title", style: config === null || config === void 0 ? void 0 : config.titleConfig }, data.percent.name))); } export default PercentBar;