UNPKG

acud

Version:

acg react 组件库

129 lines (127 loc) • 5.98 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _OutlinedCheck = _interopRequireDefault(require("acud-icon/lib/icons/OutlinedCheck")); var _OutlinedClose = _interopRequireDefault(require("acud-icon/lib/icons/OutlinedClose")); var _common = require("./common"); /** * @file 环形进度条 * @author liuhanwei */ var CircleProgress = function CircleProgress(_ref) { var _ref$percent = _ref.percent, percent = _ref$percent === void 0 ? 0 : _ref$percent, _ref$type = _ref.type, type = _ref$type === void 0 ? 'circle' : _ref$type, status = _ref.status, size = _ref.size, strokeColor = _ref.strokeColor, iconStrokeColor = _ref.iconStrokeColor, _ref$infoType = _ref.infoType, infoType = _ref$infoType === void 0 ? 'text' : _ref$infoType, trailColor = _ref.trailColor, textColor = _ref.textColor, textSize = _ref.textSize, labelText = _ref.labelText, _ref$strokeLinecap = _ref.strokeLinecap, customizeStrokeLinecap = _ref$strokeLinecap === void 0 ? 'round' : _ref$strokeLinecap, customizeStageWidth = _ref.stageWidth, customizeStrokeRatio = _ref.strokeRatio, style = _ref.style, className = _ref.className, prefixCls = _ref.prefixCls; // SVG基础视窗尺寸 var VIEX_BOX_SIZE = 50; // stageWidth取值异常时,将使用size对应的值 var stageWidth = (0, _common.isNumber)(customizeStageWidth) ? customizeStageWidth : ''; // strokeRatio取值异常时,将使用默认值 var strokeRatio = (0, _common.isNumber)(customizeStrokeRatio) ? customizeStrokeRatio : 10; // 根据strokeRatio计算strokeWidth var strokeWidth = strokeRatio * VIEX_BOX_SIZE / 100; // SVG基础视窗定义 var viewBoxPath = "0 0 ".concat(VIEX_BOX_SIZE, " ").concat(VIEX_BOX_SIZE); // 环宽度一半的位置到环心的距离 var radius = VIEX_BOX_SIZE / 2 - strokeWidth / 2; // 环路径 var circlePath = "\n M ".concat(VIEX_BOX_SIZE / 2, " ").concat(VIEX_BOX_SIZE / 2, "\n m 0 -").concat(radius, "\n a ").concat(radius, " ").concat(radius, " 0 1 1 0 ").concat(2 * radius, "\n a ").concat(radius, " ").concat(radius, " 0 1 1 0 -").concat(2 * radius, "\n "); // strokeLinecap取值不为square,则全取round var strokeLinecap = percent !== 0 ? customizeStrokeLinecap === 'square' ? 'square' : 'round' : null; // 最外层容器的类名,将所有状态类名尽可能地代理到这层处理 var extendedName = (0, _classnames["default"])(prefixCls, "".concat(prefixCls, "-").concat(type), "".concat(prefixCls, "-").concat(size), "".concat(prefixCls, "-").concat(status), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-label-hidden"), infoType === 'none'), className); // 容器样式 var stageStyles = (0, _extends2["default"])((0, _extends2["default"])({}, style), { width: "".concat(stageWidth, "px"), height: "".concat(stageWidth, "px") }); // 计算圆环周长 var perimeter = 2 * Math.PI * radius; // 填充长度 var fillLength = percent ? perimeter * (percent - 1) / 100 : 0; // 根据进度百分比设置圆环填充样式,-1为了减去linecap多出的长度 var progressStyles = { strokeDasharray: "".concat(fillLength, "px, ").concat(perimeter - fillLength, "px"), strokeDashoffset: 0, transition: 'stroke-dasharray 300ms cubic-bezier(.08, .82, .17, 1)' }; // 设置自定义文本样式 var labelStyles = { color: textColor, fontSize: "".concat(textSize, "px") }; var labelClassNames = (0, _classnames["default"])("".concat(prefixCls, "-label"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-label-icon"), infoType === 'icon')); var ProgressLabel = /*#__PURE__*/_react["default"].createElement("span", { className: labelClassNames, style: labelStyles }, labelText); var iconWidth = _common.sizeRatioMap[size] * 12; // 若信息类型为图标,在成功和异常时,显示图标 if (infoType === 'icon') { if (status === 'success') { ProgressLabel = /*#__PURE__*/_react["default"].createElement(_OutlinedCheck["default"], { className: labelClassNames, width: iconWidth, fill: iconStrokeColor }); } else if (status === 'error') { ProgressLabel = /*#__PURE__*/_react["default"].createElement(_OutlinedClose["default"], { className: labelClassNames, width: iconWidth, fill: iconStrokeColor }); } } return /*#__PURE__*/_react["default"].createElement("div", { className: extendedName, style: stageStyles }, /*#__PURE__*/_react["default"].createElement("div", { className: "".concat(prefixCls, "-trail") }, /*#__PURE__*/_react["default"].createElement("svg", { viewBox: viewBoxPath }, /*#__PURE__*/_react["default"].createElement("path", { d: circlePath, stroke: trailColor || 'currentColor', strokeWidth: strokeWidth, fill: "none" }))), /*#__PURE__*/_react["default"].createElement("div", { className: "".concat(prefixCls, "-bar") }, /*#__PURE__*/_react["default"].createElement("svg", { viewBox: viewBoxPath }, /*#__PURE__*/_react["default"].createElement("path", { d: circlePath, stroke: strokeColor || 'currentColor', strokeWidth: percent ? strokeWidth : 0, strokeLinecap: strokeLinecap, fill: "none", style: progressStyles }))), /*#__PURE__*/_react["default"].createElement("div", { className: "".concat(prefixCls, "-text-wrapper") }, ProgressLabel)); }; var _default = exports["default"] = CircleProgress;