import { PropTypes } from 'react'; import React from 'react'; import Icon from '../icon'; import { Circle } from 'rc-progress'; import classNames from 'classnames'; import splitObject from '../_util/splitObject'; const statusColorMap = { normal: '#2db7f5', exception: '#ff5500', success: '#87d068', }; export interface ProgressProps { type?: 'line' | 'circle'; percent?: number; format?: (percent: number) => string; status?: 'success' | 'active' | 'exception'; showInfo?: boolean; strokeWidth?: number; width?: number; style?: React.CSSProperties; } export default class Progress extends React.Component { static Line: any; static Circle: any; static defaultProps = { type: 'line', percent: 0, showInfo: true, trailColor: '#f3f3f3', prefixCls: 'ant-progress', }; static propTypes = { status: PropTypes.oneOf(['normal', 'exception', 'active', 'success']), type: PropTypes.oneOf(['line', 'circle']), showInfo: PropTypes.bool, percent: PropTypes.number, width: PropTypes.number, strokeWidth: PropTypes.number, trailColor: PropTypes.string, format: PropTypes.func, }; render() { const [{ prefixCls, status, format, percent, trailColor, type, strokeWidth, width, className, showInfo, }, restProps] = splitObject(this.props, ['prefixCls', 'status', 'format', 'percent', 'trailColor', 'type', 'strokeWidth', 'width', 'className', 'showInfo']); const progressStatus = (parseInt(percent, 10) >= 100 && !('status' in this.props)) ? 'success' : (status || 'normal'); let progressInfo; let progress; const textFormatter = format || (percentNumber => `${percentNumber}%`); if (showInfo) { let text; const iconType = type === 'circle' ? '' : '-circle'; if (progressStatus === 'exception') { text = format ? textFormatter(percent) : ; } else if (progressStatus === 'success') { text = format ? textFormatter(percent) : ; } else { text = textFormatter(percent); } progressInfo = {text}; } if (type === 'line') { const percentStyle = { width: `${percent}%`, height: strokeWidth || 10, }; progress = (
{progressInfo}
); } else if (type === 'circle') { const circleSize = width || 132; const circleStyle = { width: circleSize, height: circleSize, fontSize: circleSize * 0.16 + 6, }; const circleWidth = strokeWidth || 6; progress = (
{progressInfo}
); } const classString = classNames({ [`${prefixCls}`]: true, [`${prefixCls}-${type}`]: true, [`${prefixCls}-status-${progressStatus}`]: true, [`${prefixCls}-show-info`]: showInfo, [className]: !!className, }); return (
{progress}
); } }